Skip to content

Commit 255605c

Browse files
committed
Implement more TechStacks App features
1 parent ad3fdbf commit 255605c

File tree

15 files changed

+367
-90
lines changed

15 files changed

+367
-90
lines changed

src/AndroidClient/android/android.iml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="net.servicestack" external.system.module.version="0.0.1" type="JAVA_MODULE" version="4">
2+
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="net.servicestack" external.system.module.version="0.0.2" type="JAVA_MODULE" version="4">
33
<component name="FacetManager">
44
<facet type="android-gradle" name="Android-Gradle">
55
<configuration>
@@ -62,6 +62,7 @@
6262
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
6363
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
6464
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
65+
<excludeFolder url="file://$MODULE_DIR$/build/docs" />
6566
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
6667
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
6768
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
@@ -81,7 +82,11 @@
8182
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
8283
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
8384
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
85+
<excludeFolder url="file://$MODULE_DIR$/build/libs" />
8486
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
87+
<excludeFolder url="file://$MODULE_DIR$/build/poms" />
88+
<excludeFolder url="file://$MODULE_DIR$/build/reports" />
89+
<excludeFolder url="file://$MODULE_DIR$/build/test-results" />
8590
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
8691
</content>
8792
<orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />

src/AndroidClient/android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apply plugin: 'com.android.library'
22
apply plugin: 'com.github.dcendents.android-maven'
33
apply plugin: 'com.jfrog.bintray'
44

5-
version = "0.0.1"
5+
version = "0.0.2"
66

77
android {
88
compileSdkVersion 21

src/AndroidClient/app/app.iml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@
8181
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
8282
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
8383
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
84-
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
8584
</content>
8685
<orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />
8786
<orderEntry type="sourceFolder" forTests="false" />

src/AndroidClient/client/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apply plugin: 'com.android.library'
22
apply plugin: 'com.github.dcendents.android-maven'
33
apply plugin: 'com.jfrog.bintray'
44

5-
version = "0.0.1"
5+
version = "0.0.2"
66

77
android {
88
compileSdkVersion 21

src/AndroidClient/client/client.iml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="net.servicestack" external.system.module.version="0.0.1" type="JAVA_MODULE" version="4">
2+
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="net.servicestack" external.system.module.version="0.0.2" type="JAVA_MODULE" version="4">
33
<component name="FacetManager">
44
<facet type="android-gradle" name="Android-Gradle">
55
<configuration>
@@ -82,6 +82,9 @@
8282
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
8383
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
8484
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
85+
<excludeFolder url="file://$MODULE_DIR$/build/poms" />
86+
<excludeFolder url="file://$MODULE_DIR$/build/reports" />
87+
<excludeFolder url="file://$MODULE_DIR$/build/test-results" />
8588
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
8689
</content>
8790
<orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />

src/AndroidClient/client/src/main/java/net/servicestack/client/Utils.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import java.util.List;
2828
import java.util.UUID;
2929

30-
import static net.servicestack.client.Func.last;
30+
import static net.servicestack.client.Func.*;
3131

3232
// Generic Utils
3333
public class Utils {
@@ -611,4 +611,21 @@ public static String toHumanFriendlyUrl(String url){
611611
url = trimEnd(last(splitOnFirst(url, "://")), '/');
612612
return url;
613613
}
614+
615+
public static <K,V> HashMap<K,ArrayList<V>> createMap(ArrayList<V> xs, Function<V,K> f){
616+
HashMap<K,ArrayList<V>> to = new HashMap<>();
617+
if (xs == null) return to;
618+
619+
for (V val : xs){
620+
K key = f.apply(val);
621+
622+
ArrayList<V> list = to.get(key);
623+
if (list == null)
624+
to.put(key, list = new ArrayList<V>());
625+
626+
list.add(val);
627+
}
628+
629+
return to;
630+
}
614631
}

src/AndroidClient/techstacks/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,4 @@ dependencies {
2323
compile fileTree(dir: 'libs', include: ['*.jar'])
2424
compile 'com.android.support:appcompat-v7:21.0.3'
2525
compile project(':android')
26-
compile 'net.servicestack:android:0.0.1'
2726
}

src/AndroidClient/techstacks/src/main/AndroidManifest.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@
2323
<category android:name="android.intent.category.DEFAULT" />
2424
</intent-filter>
2525
</activity>
26+
<activity
27+
android:name=".TechStackActivity"
28+
android:label="TechStack" >
29+
<intent-filter>
30+
<action android:name="android.intent.action.VIEW" />
31+
<category android:name="android.intent.category.DEFAULT" />
32+
</intent-filter>
33+
</activity>
2634
</application>
2735

2836
</manifest>

src/AndroidClient/techstacks/src/main/java/servicestack/net/techstacks/App.java

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
package servicestack.net.techstacks;
22

3+
import android.app.Activity;
4+
import android.content.Intent;
35
import android.graphics.Bitmap;
6+
import android.net.Uri;
47

58
import net.servicestack.android.AndroidServiceClient;
69
import net.servicestack.android.AndroidUtils;
710
import net.servicestack.client.AsyncResult;
811
import net.servicestack.client.Utils;
912

10-
import servicestack.net.techstacks.dto.*;
11-
12-
import java.net.HttpURLConnection;
1313
import java.util.ArrayList;
1414
import java.util.HashMap;
1515

16+
import servicestack.net.techstacks.dto.*;
17+
1618
public class App {
1719

1820
public static App Instance = new App();
@@ -151,6 +153,26 @@ public void success(GetTechnologyResponse response) {
151153
});
152154
}
153155

156+
GetTechnologyStackResponse techStack = null;
157+
public GetTechnologyStackResponse getTechStack() {
158+
return techStack;
159+
}
160+
161+
public void loadTechStack(String slug) {
162+
if (techStack != null){
163+
onUpdate(DataType.TechStack);
164+
}
165+
166+
client.getAsync(new GetTechnologyStack().setSlug(slug),
167+
new AsyncResult<GetTechnologyStackResponse>() {
168+
@Override
169+
public void success(GetTechnologyStackResponse response) {
170+
techStack = response;
171+
onUpdate(DataType.TechStack);
172+
}
173+
});
174+
}
175+
154176
HashMap<String,Bitmap> imgCache = new HashMap<>();
155177
public void loadImage(final String imgUrl, final ImageResult callback) {
156178
Bitmap img = imgCache.get(imgUrl);
@@ -170,14 +192,33 @@ public void success(byte[] imgBytes) {
170192
}
171193
}
172194

195+
public static void openTechStack(Activity activity, String slug){
196+
if (slug == null) return;
197+
Intent openTechStack = new Intent(activity, TechStackActivity.class);
198+
openTechStack.putExtra("slug", slug);
199+
activity.startActivity(openTechStack);
200+
}
201+
202+
public static void openTechnology(Activity activity, String slug){
203+
if (slug == null) return;
204+
Intent openTechnology = new Intent(activity, TechnologyActivity.class);
205+
openTechnology.putExtra("slug", slug);
206+
activity.startActivity(openTechnology);
207+
}
208+
209+
public static void openUrl(Activity activity, String url){
210+
if (url == null) return;
211+
activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
212+
}
213+
173214
public static interface AppDataListener
174215
{
175216
public void onUpdate(AppData data, DataType dataType);
176217
}
177218

178-
public static class ImageResult
219+
public static interface ImageResult
179220
{
180-
public void success(Bitmap img){}
221+
public void success(Bitmap img);
181222
}
182223

183224
public static enum DataType
@@ -189,5 +230,4 @@ public static enum DataType
189230
TechStack,
190231
}
191232

192-
193233
}

src/AndroidClient/techstacks/src/main/java/servicestack/net/techstacks/MainActivity.java

Lines changed: 31 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package servicestack.net.techstacks;
22

3-
import android.content.Intent;
4-
import android.graphics.Bitmap;
5-
import android.support.v7.app.ActionBarActivity;
6-
import android.support.v7.app.ActionBar;
3+
import android.os.Bundle;
74
import android.support.v4.app.Fragment;
85
import android.support.v4.app.FragmentManager;
9-
import android.support.v4.app.FragmentTransaction;
106
import android.support.v4.app.FragmentPagerAdapter;
11-
import android.os.Bundle;
7+
import android.support.v4.app.FragmentTransaction;
128
import android.support.v4.view.ViewPager;
9+
import android.support.v7.app.ActionBar;
10+
import android.support.v7.app.ActionBarActivity;
1311
import android.text.Editable;
1412
import android.text.TextWatcher;
1513
import android.view.LayoutInflater;
@@ -20,20 +18,21 @@
2018
import android.widget.AdapterView;
2119
import android.widget.ArrayAdapter;
2220
import android.widget.EditText;
23-
import android.widget.ImageView;
2421
import android.widget.ListView;
2522
import android.widget.Spinner;
26-
import android.widget.TextView;
2723

2824
import com.android.internal.util.Predicate;
2925

30-
import static net.servicestack.client.Func.*;
31-
3226
import java.util.ArrayList;
3327

34-
import static net.servicestack.client.Func.map;
28+
import servicestack.net.techstacks.dto.Option;
29+
import servicestack.net.techstacks.dto.Technology;
30+
import servicestack.net.techstacks.dto.TechnologyInfo;
31+
import servicestack.net.techstacks.dto.TechnologyStack;
3532

36-
import servicestack.net.techstacks.dto.*;
33+
import static net.servicestack.client.Func.Function;
34+
import static net.servicestack.client.Func.filter;
35+
import static net.servicestack.client.Func.map;
3736

3837
public class MainActivity extends ActionBarActivity implements ActionBar.TabListener {
3938

@@ -177,11 +176,7 @@ public static class TopRatedFragment extends Fragment implements App.AppDataList
177176
Option selectedCategory;
178177

179178
public static TopRatedFragment create(int sectionNumber) {
180-
TopRatedFragment fragment = new TopRatedFragment();
181-
Bundle args = new Bundle();
182-
args.putInt("sectionNumber", sectionNumber);
183-
fragment.setArguments(args);
184-
return fragment;
179+
return new TopRatedFragment();
185180
}
186181

187182
@Override
@@ -215,9 +210,7 @@ public void onNothingSelected(AdapterView<?> parent) {
215210
@Override
216211
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
217212
TechnologyInfo result = getTopTechnologies(App.getData()).get(position);
218-
Intent intent = new Intent(getActivity(), TechnologyActivity.class);
219-
intent.putExtra("slug", result.getSlug());
220-
startActivity(intent);
213+
App.openTechnology(getActivity(), result.getSlug());
221214
}
222215
});
223216

@@ -285,18 +278,15 @@ public boolean apply(TechnologyInfo tech) {
285278

286279
public static class TechStacksFragment extends Fragment implements App.AppDataListener {
287280
public static TechStacksFragment create(int sectionNumber) {
288-
TechStacksFragment fragment = new TechStacksFragment();
289-
Bundle args = new Bundle();
290-
args.putInt("sectionNumber", sectionNumber);
291-
fragment.setArguments(args);
292-
return fragment;
281+
return new TechStacksFragment();
293282
}
294283

295284
@Override
296285
public void onCreate(Bundle savedInstanceState) {
297286
super.onCreate(savedInstanceState);
298-
App.getData().addListener(this);
299-
App.getData().searchTechStacks("");
287+
App.getData()
288+
.addListener(this)
289+
.searchTechStacks("");
300290
}
301291

302292
@Override
@@ -315,6 +305,15 @@ public void onTextChanged(CharSequence s, int start, int before, int count) {
315305
@Override public void afterTextChanged(Editable s) {}
316306
});
317307

308+
ListView list = (ListView) rootView.findViewById(R.id.listTechStacks);
309+
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
310+
@Override
311+
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
312+
TechnologyStack result = App.getData().getSearchTechStacksResponse().getResults().get(position);
313+
App.openTechStack(getActivity(), result.getSlug());
314+
}
315+
});
316+
318317
return rootView;
319318
}
320319

@@ -345,18 +344,15 @@ public String apply(TechnologyStack o) {
345344

346345
public static class TechnologiesFragment extends Fragment implements App.AppDataListener {
347346
public static TechnologiesFragment create(int sectionNumber) {
348-
TechnologiesFragment fragment = new TechnologiesFragment();
349-
Bundle args = new Bundle();
350-
args.putInt("sectionNumber", sectionNumber);
351-
fragment.setArguments(args);
352-
return fragment;
347+
return new TechnologiesFragment();
353348
}
354349

355350
@Override
356351
public void onCreate(Bundle savedInstanceState) {
357352
super.onCreate(savedInstanceState);
358-
App.getData().addListener(this);
359-
App.getData().searchTechnologies("");
353+
App.getData()
354+
.addListener(this)
355+
.searchTechnologies("");
360356
}
361357

362358
@Override
@@ -380,9 +376,7 @@ public void onTextChanged(CharSequence s, int start, int before, int count) {
380376
@Override
381377
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
382378
Technology result = App.getData().getSearchTechnologiesResponse().getResults().get(position);
383-
Intent intent = new Intent(getActivity(), TechnologyActivity.class);
384-
intent.putExtra("slug", result.getSlug());
385-
startActivity(intent);
379+
App.openTechnology(getActivity(), result.getSlug());
386380
}
387381
});
388382

0 commit comments

Comments
 (0)