Android: init document edit activity

This commit is contained in:
jendib 2014-11-26 23:30:25 +01:00
parent 5666d9b8b5
commit 2837b21a86
13 changed files with 192 additions and 274 deletions

View File

@ -98,13 +98,14 @@
<orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" name="recyclerview-v7-21.0.0" level="project" />
<orderEntry type="library" exported="" name="fab-0.0.5" level="project" />
<orderEntry type="library" exported="" name="fab-0.0.6" level="project" />
<orderEntry type="library" exported="" name="android-easing-1.0.3" level="project" />
<orderEntry type="library" exported="" name="support-annotations-21.0.2" level="project" />
<orderEntry type="library" exported="" name="imagezoom-1.0.5" level="project" />
<orderEntry type="library" exported="" name="support-v4-21.0.2" level="project" />
<orderEntry type="library" exported="" name="eventbus-2.4.0" level="project" />
<orderEntry type="library" exported="" name="android-query.0.26.8" level="project" />
<orderEntry type="library" exported="" name="tokenautocomplete-1.2.1" level="project" />
<orderEntry type="library" exported="" name="appcompat-v7-21.0.2" level="project" />
<orderEntry type="library" exported="" name="android-async-http-1.4.6" level="project" />
</component>

View File

@ -3,7 +3,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.14.4'
classpath 'com.android.tools.build:gradle:1.0.0-rc1'
}
}
apply plugin: 'com.android.application'
@ -36,5 +36,5 @@ dependencies {
compile 'com.loopj.android:android-async-http:1.4.6'
compile 'it.sephiroth.android.library.imagezoom:imagezoom:1.0.5'
compile 'de.greenrobot:eventbus:2.4.0'
compile 'com.shamanland:fab:0.0.5'
compile 'com.shamanland:fab:0.0.6'
}

Binary file not shown.

View File

@ -37,6 +37,11 @@
android:label=""
android:logo="@drawable/ic_launcher">
</activity>
<activity
android:name=".activity.DocumentEditActivity"
android:label="@string/new_document"
android:logo="@drawable/ic_launcher">
</activity>
<provider android:name=".provider.RecentSuggestionsProvider"
android:exported="false"
android:authorities="com.sismics.docs.provider.RecentSuggestionsProvider" />

View File

@ -23,6 +23,8 @@ public class MainApplication extends Application {
// TODO Fullscreen preview
// TODO Caching preferences
// TODO Edit sharing
// TODO Documents adding/editing
// TODO Files adding/deleting
super.onCreate();
}

View File

@ -0,0 +1,56 @@
package com.sismics.docs.activity;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.MultiAutoCompleteTextView;
import android.widget.Spinner;
import com.sismics.docs.R;
/**
* Document edition activity.
*
* @author bgamard.
*/
public class DocumentEditActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle args) {
super.onCreate(args);
// Handle activity context
if (getIntent() == null) {
finish();
return;
}
// Setup the activity
setContentView(R.layout.document_edit_activity);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
}
Spinner languageSpinner = (Spinner) findViewById(R.id.languageSpinner);
languageSpinner.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item,
new String[] { "French", "English", "Japanese" }));
MultiAutoCompleteTextView tagsEditText = (MultiAutoCompleteTextView) findViewById(R.id.tagsEditText);
tagsEditText.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item,
new String[] { "Caluire", "Appartement", "Banque", "Assurance" }));
tagsEditText.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}

View File

@ -9,11 +9,13 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.sismics.docs.R;
import com.sismics.docs.activity.DocumentActivity;
import com.sismics.docs.activity.DocumentEditActivity;
import com.sismics.docs.adapter.DocListAdapter;
import com.sismics.docs.event.SearchEvent;
import com.sismics.docs.listener.JsonHttpResponseHandler;
@ -114,6 +116,16 @@ public class DocListFragment extends Fragment {
}
});
// Add document button
ImageButton addDocumentButton = (ImageButton) view.findViewById(R.id.addDocumentButton);
addDocumentButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), DocumentEditActivity.class);
startActivityForResult(intent, 1);
}
});
// Grab the documents
loadDocuments(view, true);

View File

@ -0,0 +1,46 @@
package com.sismics.docs.ui.view;
import android.app.DatePickerDialog;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.DatePicker;
import android.widget.TextView;
import java.util.Calendar;
public class DatePickerView extends TextView implements DatePickerDialog.OnDateSetListener{
public DatePickerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public DatePickerView(Context context, AttributeSet attrs) {
super(context, attrs);
setAttributes();
}
public DatePickerView(Context context) {
super(context);
setAttributes();
}
private void setAttributes() {
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final Calendar calendar = Calendar.getInstance();
new DatePickerDialog(
DatePickerView.this.getContext(), DatePickerView.this,
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH)).show();
}
});
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
setText(String.format("%s/%s/%s", monthOfYear, dayOfMonth, year));
}
}

View File

@ -1,268 +0,0 @@
package com.sismics.docs.ui.view;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.ImageButton;
import android.widget.ImageView;
/**
* A circular button made of paper that lifts and emits ink reactions on press.
* <p/>
* This widget supports two sizes: {@link #SIZE_NORMAL} and {@link #SIZE_MINI}
* according to <a href="http://www.google.com/design/spec/patterns/promoted-actions.html">Promoted Actions</a> pattern.
* <p/>
* Like an {@link ImageView} this widget require {@code android:src} attribute.
* According to official documentation this drawable should be not more than {@code 24dp}.
* <p/>
* Use theme to customize all floating buttons in your app:
* <p/>
* Declare own style:
* <pre>
* &lt;style name=&quot;AppTheme.Fab&quot; parent=&quot;FloatingActionButton&quot;&gt;
* &lt;item name=&quot;floatingActionButtonColor&quot;&gt;@color/my_fab_color&lt;/item&gt;
* &lt;/style&gt;
* </pre>
* Link this style in your theme:
* <pre>
* &lt;style name=&quot;AppTheme&quot; parent=&quot;android:Theme&quot;&gt;
* &lt;item name=&quot;floatingActionButtonStyle&quot;&gt;@style/AppTheme.Fab&lt;/item&gt;
* &lt;/style&gt;
* </pre>
* <p/>
* Customizing in layout.xml:
* <pre>
* &lt;com.shamanland.fab.FloatingActionButton
* android:layout_width=&quot;wrap_content&quot;
* android:layout_height=&quot;wrap_content&quot;
* android:src=&quot;@drawable/ic_action_my&quot;
* app:floatingActionButtonColor=&quot;@color/my_fab_color&quot;
* app:floatingActionButtonSize=&quot;mini&quot;
* /&gt;
* </pre>
* <p/>
* Customizing in java-code:
* <pre>
* FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
* fab.setSize(FloatingActionButton.SIZE_MINI);
* fab.setColor(Color.RED);
* // NOTE invoke this method after setting new values!
* fab.initBackground();
* // NOTE standard method of ImageView
* fab.setImageResource(R.drawable.ic_action_my);
* </pre>
*/
public class FloatingActionButton extends ImageButton {
/**
* Constant representing normal size {@code 56dp}. Value: 0x0
*/
public static final int SIZE_NORMAL = 0;
/**
* Constant representing mini size {@code 40dp}. Value: 0x1
*/
public static final int SIZE_MINI = 1;
private int mSize;
private int mColor;
private ColorStateList mColorStateList;
private GradientDrawable mCircleDrawable;
/**
* Gets abstract size of this button.
*
* @return {@link #SIZE_NORMAL} or {@link #SIZE_MINI}
*/
public int getSize() {
return mSize;
}
/**
* Sets abstract size for this button.
* <p/>
* Xml attribute: {@code app:floatingActionButtonSize}
*
* @param size {@link #SIZE_NORMAL} or {@link #SIZE_MINI}
*/
public void setSize(int size) {
mSize = size;
}
/**
* Gets background color of this button.
*
* @return color
*/
public int getColor() {
return mColor;
}
/**
* Sets background color for this button.
* <p/>
* Xml attribute: {@code app:floatingActionButtonColor}
*
* @param color color
*/
public void setColor(int color) {
mColor = color;
}
/**
* Gets color state list used as background for this button.
*
* @return may be null
*/
public ColorStateList getColorStateList() {
return mColorStateList;
}
/**
* Sets color state list as background for this button.
* <p/>
* Xml attribute: {@code app:floatingActionButtonColor}
*
* @param colorStateList color
*/
public void setColorStateList(ColorStateList colorStateList) {
mColorStateList = colorStateList;
}
public FloatingActionButton(Context context) {
super(context);
init(context, null, 0);
}
public FloatingActionButton(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, com.shamanland.fab.R.attr.floatingActionButtonStyle);
}
public FloatingActionButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs, int defStyle) {
TypedArray a;
try {
if (isInEditMode()) {
return;
}
if (attrs == null) {
return;
}
Resources.Theme theme = context.getTheme();
if (theme == null) {
return;
}
a = theme.obtainStyledAttributes(attrs, com.shamanland.fab.R.styleable.FloatingActionButton, defStyle, com.shamanland.fab.R.style.FloatingActionButton_Dark);
if (a == null) {
return;
}
} finally {
mSize = SIZE_NORMAL;
mColor = Color.GRAY;
mColorStateList = null;
}
try {
initAttrs(a);
} finally {
a.recycle();
}
initBackground();
}
private void initAttrs(TypedArray a) {
setSize(a.getInteger(com.shamanland.fab.R.styleable.FloatingActionButton_floatingActionButtonSize, SIZE_NORMAL));
setColor(a.getColor(com.shamanland.fab.R.styleable.FloatingActionButton_floatingActionButtonColor, Color.GRAY));
setColorStateList(a.getColorStateList(com.shamanland.fab.R.styleable.FloatingActionButton_floatingActionButtonColor));
}
/**
* Inflate and initialize background drawable for this view with arguments
* inflated from xml or specified using {@link #setSize(int)} or {@link #setColor(int)}
* <p/>
* Invoked from constructor, but it's allowed to invoke this method manually from code.
*/
public void initBackground() {
final int backgroundId;
if (mSize == SIZE_MINI) {
backgroundId = com.shamanland.fab.R.drawable.com_shamanland_fab_circle_mini;
} else {
backgroundId = com.shamanland.fab.R.drawable.com_shamanland_fab_circle_normal;
}
Drawable background = getResources().getDrawable(backgroundId);
if (background instanceof LayerDrawable) {
LayerDrawable layers = (LayerDrawable) background;
if (layers.getNumberOfLayers() == 2) {
Drawable shadow = layers.getDrawable(0);
Drawable circle = layers.getDrawable(1);
if (shadow instanceof GradientDrawable) {
((GradientDrawable) shadow.mutate()).setGradientRadius(getShadowRadius(shadow, circle));
}
if (circle instanceof GradientDrawable) {
mCircleDrawable = (GradientDrawable) circle.mutate();
mCircleDrawable.setColor(mColor);
}
}
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
//noinspection deprecation
setBackgroundDrawable(background);
} else {
setBackground(background);
}
}
@Override
protected void drawableStateChanged() {
super.drawableStateChanged();
if (mCircleDrawable != null && mColorStateList != null) {
mCircleDrawable.setColor(mColorStateList.getColorForState(getDrawableState(), mColor));
// NOTE maybe this line is required only for Gingerbread
invalidate();
}
}
/**
* Calculates required radius of shadow.
*
* @param shadow underlay drawable
* @param circle overlay drawable
* @return calculated radius, always >= 1
*/
protected static int getShadowRadius(Drawable shadow, Drawable circle) {
int radius = 0;
if (shadow != null && circle != null) {
Rect rect = new Rect();
radius = (circle.getIntrinsicWidth() + (shadow.getPadding(rect) ? rect.left + rect.right : 0)) / 2;
}
return Math.max(1, radius);
}
}

View File

@ -37,7 +37,7 @@
android:textSize="16sp"
android:layout_centerInParent="true"/>
<com.sismics.docs.ui.view.FloatingActionButton
<com.shamanland.fab.FloatingActionButton
android:id="@+id/addDocumentButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/titleEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:padding="16dp"
android:hint="Title"/>
<EditText
android:id="@+id/descriptionEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:layout_margin="8dp"
android:padding="16dp"
android:hint="Description"
android:lines="2"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:text="Creation date"
android:textColor="#9f9f9f"
android:fontFamily="sans-serif"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:textSize="16sp"
android:padding="16dp"/>
<com.sismics.docs.ui.view.DatePickerView
android:id="@+id/dateEditText"
style="@android:style/Widget.DeviceDefault.Light.Spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:text="15/11/2014"
android:padding="16dp"/>
</LinearLayout>
<Spinner
android:id="@+id/languageSpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:padding="16dp"/>
<MultiAutoCompleteTextView
android:id="@+id/tagsEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"/>
</LinearLayout>

View File

@ -41,5 +41,6 @@
<string name="error_loading_documents">Error loading documents</string>
<string name="no_files">No files</string>
<string name="error_loading_files">Error loading files</string>
<string name="new_document">New document</string>
</resources>

View File

@ -1,6 +1,6 @@
#Tue Nov 18 23:58:08 CET 2014
#Wed Nov 26 21:58:48 CET 2014
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip