Skip to content

Commit 8b376f2

Browse files
Bogdan MelnychukBogdan Melnychuk
Bogdan Melnychuk
authored and
Bogdan Melnychuk
committed
Initial version
1 parent 0358de3 commit 8b376f2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+2314
-0
lines changed

Diff for: app/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

Diff for: app/build.gradle

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
apply plugin: 'com.android.application'
2+
3+
android {
4+
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)
5+
buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
6+
7+
defaultConfig {
8+
applicationId "com.unnamed.b.atv.sample"
9+
minSdkVersion Integer.parseInt(project.ANDROID_BUILD_MIN_SDK_VERSION)
10+
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)
11+
versionName project.VERSION_NAME
12+
versionCode Integer.parseInt(project.VERSION_CODE)
13+
}
14+
buildTypes {
15+
release {
16+
minifyEnabled false
17+
}
18+
}
19+
}
20+
21+
dependencies {
22+
compile fileTree(dir: 'libs', include: ['*.jar'])
23+
compile 'com.android.support:appcompat-v7:21.0.3'
24+
compile 'com.github.johnkil.print:print:1.2.2'
25+
compile project(':library')
26+
}

Diff for: app/proguard-rules.pro

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Add project specific ProGuard rules here.
2+
# By default, the flags in this file are appended to flags specified
3+
# in /Users/bogdan/Library/Android/sdk/tools/proguard/proguard-android.txt
4+
# You can edit the include path and order by changing the proguardFiles
5+
# directive in build.gradle.
6+
#
7+
# For more details, see
8+
# http://developer.android.com/guide/developing/tools/proguard.html
9+
10+
# Add any project specific keep options here:
11+
12+
# If your project uses WebView with JS, uncomment the following
13+
# and specify the fully qualified class name to the JavaScript interface
14+
# class:
15+
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16+
# public *;
17+
#}

Diff for: app/src/main/AndroidManifest.xml

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
package="com.unnamed.b.atv.sample">
4+
5+
<application
6+
android:allowBackup="true"
7+
android:icon="@drawable/ic_launcher"
8+
android:label="@string/app_name"
9+
android:theme="@style/AppTheme">
10+
<activity
11+
android:name=".activity.MainActivity"
12+
android:label="@string/app_name">
13+
<intent-filter>
14+
<action android:name="android.intent.action.MAIN" />
15+
16+
<category android:name="android.intent.category.LAUNCHER" />
17+
</intent-filter>
18+
</activity>
19+
<activity android:name=".activity.SingleFragmentActivity" />
20+
</application>
21+
22+
</manifest>

Diff for: app/src/main/assets/fonts/material-icon-font.ttf

47.4 KB
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.unnamed.b.atv.sample.activity;
2+
3+
import android.content.Context;
4+
import android.content.Intent;
5+
import android.os.Bundle;
6+
import android.support.v7.app.ActionBarActivity;
7+
import android.view.View;
8+
import android.widget.AdapterView;
9+
import android.widget.ArrayAdapter;
10+
import android.widget.ListView;
11+
12+
import com.unnamed.b.atv.sample.R;
13+
import com.unnamed.b.atv.sample.fragment.CustomViewHolderFragment;
14+
import com.unnamed.b.atv.sample.fragment.FolderStructureFragment;
15+
16+
import java.util.ArrayList;
17+
import java.util.LinkedHashMap;
18+
import java.util.List;
19+
20+
21+
public class MainActivity extends ActionBarActivity {
22+
23+
24+
@Override
25+
protected void onCreate(Bundle savedInstanceState) {
26+
super.onCreate(savedInstanceState);
27+
setContentView(R.layout.activity_main);
28+
29+
30+
final LinkedHashMap<String, Class<?>> listItems = new LinkedHashMap<>();
31+
listItems.put("Folder Structure Example", FolderStructureFragment.class);
32+
listItems.put("Custom Holder Example", CustomViewHolderFragment.class);
33+
34+
35+
final List<String> list = new ArrayList(listItems.keySet());
36+
final ListView listview = (ListView) findViewById(R.id.listview);
37+
final SimpleArrayAdapter adapter = new SimpleArrayAdapter(this, list);
38+
listview.setAdapter(adapter);
39+
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
40+
@Override
41+
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
42+
Class<?> clazz = listItems.values().toArray(new Class<?>[]{})[position];
43+
Intent i = new Intent(MainActivity.this, SingleFragmentActivity.class);
44+
i.putExtra(SingleFragmentActivity.FRAGMENT_PARAM, clazz);
45+
MainActivity.this.startActivity(i);
46+
}
47+
});
48+
49+
}
50+
51+
private class SimpleArrayAdapter extends ArrayAdapter<String> {
52+
public SimpleArrayAdapter(Context context, List<String> objects) {
53+
super(context, android.R.layout.simple_list_item_1, objects);
54+
55+
}
56+
57+
@Override
58+
public long getItemId(int position) {
59+
return position;
60+
}
61+
}
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.unnamed.b.atv.sample.activity;
2+
3+
import android.app.Fragment;
4+
import android.os.Bundle;
5+
import android.support.v7.app.ActionBarActivity;
6+
7+
import com.unnamed.b.atv.sample.R;
8+
9+
/**
10+
* Created by Bogdan Melnychuk on 2/12/15.
11+
*/
12+
public class SingleFragmentActivity extends ActionBarActivity {
13+
public final static String FRAGMENT_PARAM = "fragment";
14+
15+
@Override
16+
protected void onCreate(Bundle bundle) {
17+
super.onCreate(bundle);
18+
setContentView(R.layout.activity_single_fragment);
19+
20+
Bundle b = getIntent().getExtras();
21+
Class<?> fragmentClass = (Class<?>) b.get(FRAGMENT_PARAM);
22+
if (bundle == null) {
23+
Fragment f = Fragment.instantiate(this, fragmentClass.getName());
24+
f.setArguments(b);
25+
getFragmentManager().beginTransaction().replace(R.id.fragment, f, fragmentClass.getName()).commit();
26+
}
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.unnamed.b.atv.sample.fragment;
2+
3+
import android.app.Fragment;
4+
import android.os.Bundle;
5+
import android.view.LayoutInflater;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
import android.widget.TextView;
9+
10+
import com.unnamed.b.atv.model.TreeNode;
11+
import com.unnamed.b.atv.sample.R;
12+
import com.unnamed.b.atv.sample.holder.HeaderHolder;
13+
import com.unnamed.b.atv.sample.holder.IconTreeItemHolder;
14+
import com.unnamed.b.atv.sample.holder.PlaceHolderHolder;
15+
import com.unnamed.b.atv.sample.holder.ProfileHolder;
16+
import com.unnamed.b.atv.sample.holder.SocialViewHolder;
17+
import com.unnamed.b.atv.view.AndroidTreeView;
18+
19+
/**
20+
* Created by Bogdan Melnychuk on 2/12/15.
21+
*/
22+
public class CustomViewHolderFragment extends Fragment {
23+
private TextView statusBar;
24+
25+
@Override
26+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
27+
final View rootView = inflater.inflate(R.layout.fragment_default, null, false);
28+
final ViewGroup containerView = (ViewGroup) rootView.findViewById(R.id.container);
29+
statusBar = (TextView) rootView.findViewById(R.id.status_bar);
30+
statusBar.setVisibility(View.GONE);
31+
32+
final TreeNode root = TreeNode.root();
33+
34+
TreeNode myProfile = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_person, "My Profile")).setViewHolder(new ProfileHolder(getActivity()));
35+
TreeNode bruce = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_person, "Bruce Wayne")).setViewHolder(new ProfileHolder(getActivity()));
36+
TreeNode clark = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_person, "Clark Kent")).setViewHolder(new ProfileHolder(getActivity()));
37+
TreeNode barry = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_person, "Barry Allen")).setViewHolder(new ProfileHolder(getActivity()));
38+
addProfileData(myProfile);
39+
addProfileData(clark);
40+
addProfileData(bruce);
41+
addProfileData(barry);
42+
root.addChildren(myProfile, bruce, barry, clark);
43+
44+
AndroidTreeView tView = new AndroidTreeView(getActivity(), root);
45+
tView.setDefaultContainerStyle(R.style.TreeNodeStyleDivided, true);
46+
containerView.addView(tView.getView());
47+
48+
return rootView;
49+
}
50+
51+
private void addProfileData(TreeNode profile) {
52+
TreeNode socialNetworks = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_people, "Social")).setViewHolder(new HeaderHolder(getActivity()));
53+
TreeNode places = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_place, "Places")).setViewHolder(new HeaderHolder(getActivity()));
54+
55+
TreeNode facebook = new TreeNode(new SocialViewHolder.SocialItem(R.string.ic_post_facebook)).setViewHolder(new SocialViewHolder(getActivity()));
56+
TreeNode linkedin = new TreeNode(new SocialViewHolder.SocialItem(R.string.ic_post_linkedin)).setViewHolder(new SocialViewHolder(getActivity()));
57+
TreeNode google = new TreeNode(new SocialViewHolder.SocialItem(R.string.ic_post_gplus)).setViewHolder(new SocialViewHolder(getActivity()));
58+
TreeNode twitter = new TreeNode(new SocialViewHolder.SocialItem(R.string.ic_post_twitter)).setViewHolder(new SocialViewHolder(getActivity()));
59+
60+
TreeNode lake = new TreeNode(new PlaceHolderHolder.PlaceItem("A rose garden")).setViewHolder(new PlaceHolderHolder(getActivity()));
61+
TreeNode mountains = new TreeNode(new PlaceHolderHolder.PlaceItem("The white house")).setViewHolder(new PlaceHolderHolder(getActivity()));
62+
63+
places.addChildren(lake, mountains);
64+
socialNetworks.addChildren(facebook, google, twitter, linkedin);
65+
profile.addChildren(socialNetworks, places);
66+
}
67+
68+
69+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.unnamed.b.atv.sample.fragment;
2+
3+
import android.app.Fragment;
4+
import android.os.Bundle;
5+
import android.view.LayoutInflater;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
import android.widget.TextView;
9+
import android.widget.Toast;
10+
11+
import com.unnamed.b.atv.model.TreeNode;
12+
import com.unnamed.b.atv.sample.R;
13+
import com.unnamed.b.atv.sample.holder.IconTreeItemHolder;
14+
import com.unnamed.b.atv.view.AndroidTreeView;
15+
16+
/**
17+
* Created by Bogdan Melnychuk on 2/12/15.
18+
*/
19+
public class FolderStructureFragment extends Fragment {
20+
private TextView statusBar;
21+
22+
@Override
23+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
24+
View rootView = inflater.inflate(R.layout.fragment_default, null, false);
25+
ViewGroup containerView = (ViewGroup) rootView.findViewById(R.id.container);
26+
27+
statusBar = (TextView) rootView.findViewById(R.id.status_bar);
28+
29+
TreeNode root = TreeNode.root();
30+
TreeNode computerRoot = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_laptop, "My Computer"));
31+
32+
TreeNode myDocuments = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_folder, "My Documents"));
33+
TreeNode downloads = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_folder, "Downloads"));
34+
TreeNode file1 = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_drive_file, "File 1"));
35+
TreeNode file2 = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_drive_file, "File 2"));
36+
TreeNode file3 = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_drive_file, "File 3"));
37+
TreeNode file4 = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_drive_file, "File 4"));
38+
fillDownloadsFolder(downloads);
39+
downloads.addChildren(file1, file2, file3, file4);
40+
41+
TreeNode myMedia = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_photo_library, "Photos"));
42+
TreeNode photo1 = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_photo, "Photo 1"));
43+
TreeNode photo2 = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_photo, "Photo 2"));
44+
TreeNode photo3 = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_photo, "Photo 3"));
45+
myMedia.addChildren(photo1, photo2, photo3);
46+
47+
myDocuments.addChild(downloads);
48+
computerRoot.addChildren(myDocuments, myMedia);
49+
50+
root.addChildren(computerRoot);
51+
52+
AndroidTreeView tView = new AndroidTreeView(getActivity(), root);
53+
tView.setDefaultContainerStyle(R.style.TreeNodeStyleCustom);
54+
tView.setDefaultViewHolder(IconTreeItemHolder.class);
55+
tView.setDefaultNodeClickListener(nodeClickListener);
56+
57+
containerView.addView(tView.getView());
58+
tView.expandNode(computerRoot);
59+
60+
return rootView;
61+
}
62+
63+
private static int counter = 0;
64+
65+
private void fillDownloadsFolder(TreeNode node) {
66+
TreeNode downloads = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_folder, "Downloads" + (counter++)));
67+
node.addChild(downloads);
68+
if (counter < 5) {
69+
fillDownloadsFolder(downloads);
70+
}
71+
}
72+
73+
private TreeNode.TreeNodeClickListener nodeClickListener = new TreeNode.TreeNodeClickListener() {
74+
@Override
75+
public void onClick(TreeNode node, Object value) {
76+
IconTreeItemHolder.IconTreeItem item = (IconTreeItemHolder.IconTreeItem) value;
77+
statusBar.setText("Last clicked: " + item.text);
78+
if (node.isLeaf()) {
79+
Toast.makeText(getActivity(), item.text, Toast.LENGTH_SHORT).show();
80+
}
81+
}
82+
};
83+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.unnamed.b.atv.sample.holder;
2+
3+
import android.content.Context;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.widget.TextView;
7+
8+
import com.github.johnkil.print.PrintView;
9+
import com.unnamed.b.atv.model.TreeNode;
10+
import com.unnamed.b.atv.sample.R;
11+
12+
/**
13+
* Created by Bogdan Melnychuk on 2/13/15.
14+
*/
15+
public class HeaderHolder extends TreeNode.BaseNodeViewHolder {
16+
17+
private PrintView arrowView;
18+
19+
public HeaderHolder(Context context) {
20+
super(context);
21+
}
22+
23+
@Override
24+
public View createNodeView(TreeNode node) {
25+
final IconTreeItemHolder.IconTreeItem value = (IconTreeItemHolder.IconTreeItem) node.getValue();
26+
final LayoutInflater inflater = LayoutInflater.from(context);
27+
final View view = inflater.inflate(R.layout.layout_header_node, null, false);
28+
TextView tvValue = (TextView) view.findViewById(R.id.node_value);
29+
tvValue.setText(value.text);
30+
31+
final PrintView iconView = (PrintView) view.findViewById(R.id.icon);
32+
iconView.setIconText(context.getResources().getString(value.icon));
33+
34+
arrowView = (PrintView) view.findViewById(R.id.arrow_icon);
35+
if (node.isLeaf()) {
36+
arrowView.setVisibility(View.INVISIBLE);
37+
}
38+
39+
return view;
40+
}
41+
42+
@Override
43+
public void toggle(boolean active) {
44+
arrowView.setIconText(context.getResources().getString(active ? R.string.ic_keyboard_arrow_down : R.string.ic_keyboard_arrow_right));
45+
}
46+
47+
48+
}

0 commit comments

Comments
 (0)