Skip to content

Add ParseListLoader #92

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 22 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
53c21a1
Merge pull request #84 from ParsePlatform/wangmengyan.add_upload_arch…
wangmengyan95 Nov 2, 2015
42166dd
Update maven pom license
wangmengyan95 Nov 3, 2015
81df4c3
Merge pull request #87 from ParsePlatform/wangmengyan.update_license
wangmengyan95 Nov 4, 2015
e5040c8
Add group in build.gradle
wangmengyan95 Nov 9, 2015
fd3d228
Merge pull request #90 from ParsePlatform/wangmengyan.update_upload_a…
wangmengyan95 Nov 9, 2015
195fd49
Update README
wangmengyan95 Nov 11, 2015
ea5f7eb
Merge pull request #91 from ParsePlatform/wangmengyan.update_README_f…
wangmengyan95 Nov 11, 2015
640c803
Disable landscape for LoginActivity
wangmengyan95 Nov 18, 2015
462ca97
Merge pull request #96 from ParsePlatform/wangmengyan.disable_landscape
wangmengyan95 Nov 18, 2015
e7a58e4
Allow disable name field in signup form
wangmengyan95 Nov 18, 2015
2db4219
Merge pull request #97 from ParsePlatform/wangmengyan.allow_disable_n…
wangmengyan95 Nov 19, 2015
ddf72b9
Allow pass extras to target activity
wangmengyan95 Nov 19, 2015
c2d2e65
Update README.md to include ParseTwitterUtils
wangmengyan95 Nov 20, 2015
dc42a80
Merge pull request #99 from ParsePlatform/wangmengyan.add_extra_args_…
wangmengyan95 Dec 8, 2015
4110b81
Add support for Korean language
wangmengyan95 Dec 8, 2015
5acdced
Replace deprecated onAttach method
wangmengyan95 Dec 9, 2015
f4c605d
Merge pull request #106 from ParsePlatform/wangmengyan.add_support_fo…
wangmengyan95 Dec 9, 2015
2a7adf2
Add support for Chinese
wangmengyan95 Dec 9, 2015
572e84f
Merge pull request #107 from ParsePlatform/wangmengyan.replace_deprec…
wangmengyan95 Dec 9, 2015
0811f41
Merge pull request #108 from ParsePlatform/wangmengyan.add_support_fo…
wangmengyan95 Dec 10, 2015
61cb9b5
Add support for Portuguese
wangmengyan95 Dec 10, 2015
6181bd8
Merge pull request #110 from ParsePlatform/wangmengyan.add_support_fo…
hramos Dec 10, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion ParseUI-Login/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import com.android.builder.core.BuilderConstants
apply plugin: 'android-library'

version = "0.0.1"
group = 'com.parse'

dependencies {
compile 'com.android.support:support-v4:23.0.1'
Expand Down Expand Up @@ -110,7 +111,7 @@ uploadArchives {

licenses {
license {
name 'BSD License'
name 'Platform License'
url 'https://github.com/ParsePlatform/ParseUI-Android/blob/master/LICENSE'
distribution 'repo'
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ public class ParseLoginActivity extends FragmentActivity implements
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Disable landscape
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

this.requestWindowFeature(Window.FEATURE_NO_TITLE);

// Combine options from incoming intent and the activity metadata
Expand Down
12 changes: 12 additions & 0 deletions ParseUI-Login/src/main/java/com/parse/ui/ParseLoginBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,18 @@ public ParseLoginBuilder setParseSignupSubmitButtonText(int id) {
return setParseSignupSubmitButtonText(maybeGetString(id));
}

/**
* Whether to show the name field in the signup form. Default is true.
*
* @param enabled
* Whether to show the name field in the signup form.
* @return The caller instance to allow chaining.
*/
public ParseLoginBuilder setParseSignupNameFieldEnabled(boolean enabled) {
config.setParseSignupNameFieldEnabled(enabled);
return this;
}

/**
* Whether to show the Facebook login option on the login screen. Default is
* false.
Expand Down
20 changes: 20 additions & 0 deletions ParseUI-Login/src/main/java/com/parse/ui/ParseLoginConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public class ParseLoginConfig {
public static final String PARSE_LOGIN_EMAIL_AS_USERNAME = "com.parse.ui.ParseLoginActivity.PARSE_LOGIN_EMAIL_AS_USERNAME";
public static final String PARSE_SIGNUP_MIN_PASSWORD_LENGTH = "com.parse.ui.ParseLoginActivity.PARSE_SIGNUP_MIN_PASSWORD_LENGTH";
public static final String PARSE_SIGNUP_SUBMIT_BUTTON_TEXT = "com.parse.ui.ParseLoginActivity.PARSE_SIGNUP_SUBMIT_BUTTON_TEXT";
public static final String PARSE_SIGNUP_NAME_FIELD_ENABLED = "com.parse.ui.ParseLoginActivity.PARSE_SIGNUP_NAME_FIELD_ENABLED";
public static final String FACEBOOK_LOGIN_ENABLED = "com.parse.ui.ParseLoginActivity.FACEBOOK_LOGIN_ENABLED";
public static final String FACEBOOK_LOGIN_BUTTON_TEXT = "com.parse.ui.ParseLoginActivity.FACEBOOK_LOGIN_BUTTON_TEXT";
public static final String FACEBOOK_LOGIN_PERMISSIONS = "com.parse.ui.ParseLoginActivity.FACEBOOK_LOGIN_PERMISSIONS";
Expand All @@ -70,6 +71,7 @@ public class ParseLoginConfig {
private Boolean parseLoginEmailAsUsername;
private Integer parseSignupMinPasswordLength;
private CharSequence parseSignupSubmitButtonText;
private Boolean parseSignupNameFieldEnabled;

private Boolean facebookLoginEnabled;
private CharSequence facebookLoginButtonText;
Expand Down Expand Up @@ -160,6 +162,18 @@ public void setParseSignupSubmitButtonText(
this.parseSignupSubmitButtonText = parseSignupSubmitButtonText;
}

public Boolean isParseSignupNameFieldEnabled() {
if (parseSignupNameFieldEnabled != null) {
return parseSignupNameFieldEnabled;
} else {
return true;
}
}

public void setParseSignupNameFieldEnabled(Boolean parseSignupNameFieldEnabled) {
this.parseSignupNameFieldEnabled = parseSignupNameFieldEnabled;
}

public boolean isFacebookLoginEnabled() {
if (facebookLoginEnabled != null) {
return facebookLoginEnabled;
Expand Down Expand Up @@ -267,6 +281,9 @@ public Bundle toBundle() {
bundle.putCharSequence(PARSE_SIGNUP_SUBMIT_BUTTON_TEXT,
parseSignupSubmitButtonText);
}
if (parseSignupNameFieldEnabled != null) {
bundle.putBoolean(PARSE_SIGNUP_NAME_FIELD_ENABLED, parseSignupNameFieldEnabled);
}

if (facebookLoginEnabled != null) {
bundle.putBoolean(FACEBOOK_LOGIN_ENABLED, facebookLoginEnabled);
Expand Down Expand Up @@ -336,6 +353,9 @@ public static ParseLoginConfig fromBundle(Bundle bundle, Context context) {
if (keys.contains(PARSE_SIGNUP_SUBMIT_BUTTON_TEXT)) {
config.setParseSignupSubmitButtonText(bundle.getCharSequence(PARSE_SIGNUP_SUBMIT_BUTTON_TEXT));
}
if (keys.contains(PARSE_SIGNUP_NAME_FIELD_ENABLED)) {
config.setParseSignupNameFieldEnabled(bundle.getBoolean(PARSE_SIGNUP_NAME_FIELD_ENABLED));
}

if (keys.contains(FACEBOOK_LOGIN_ENABLED)) {
config.setFacebookLoginEnabled(bundle.getBoolean(FACEBOOK_LOGIN_ENABLED));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,12 @@ protected Intent getParseLoginIntent() {
private void runDispatch() {
if (ParseUser.getCurrentUser() != null) {
debugLog(getString(R.string.com_parse_ui_login_dispatch_user_logged_in) + getTargetClass());
startActivityForResult(new Intent(this, getTargetClass()), TARGET_REQUEST);
Intent targetIntent = new Intent(this, getTargetClass());
Bundle extras = getIntent().getExtras();
if (extras != null) {
targetIntent.putExtras(extras);
}
startActivityForResult(targetIntent, TARGET_REQUEST);
} else {
debugLog(getString(R.string.com_parse_ui_login_dispatch_user_not_logged_in));
startActivityForResult(getParseLoginIntent(), LOGIN_REQUEST);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
package com.parse.ui;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.InputType;
import android.view.LayoutInflater;
Expand Down Expand Up @@ -119,9 +120,10 @@ public View onCreateView(LayoutInflater inflater, ViewGroup parent,
}

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
public void onAttach(Context context) {
super.onAttach(context);

final Activity activity = getActivity();
if (activity instanceof ParseLoginFragmentListener) {
loginFragmentListener = (ParseLoginFragmentListener) activity;
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup parent,
minPasswordLength = config.getParseSignupMinPasswordLength();
}

String username = (String) args.getString(USERNAME);
String password = (String) args.getString(PASSWORD);
String username = args.getString(USERNAME);
String password = args.getString(PASSWORD);

View v = inflater.inflate(R.layout.com_parse_ui_parse_signup_fragment,
parent, false);
Expand All @@ -91,6 +91,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup parent,
.findViewById(R.id.signup_confirm_password_input);
emailField = (EditText) v.findViewById(R.id.signup_email_input);
nameField = (EditText) v.findViewById(R.id.signup_name_input);
if (!config.isParseSignupNameFieldEnabled()) {
nameField.setVisibility(View.INVISIBLE);
}
createAccountButton = (Button) v.findViewById(R.id.create_account);

usernameField.setText(username);
Expand Down Expand Up @@ -172,7 +175,7 @@ public void onClick(View v) {
confirmPasswordField.requestFocus();
} else if (email != null && email.length() == 0) {
showToast(R.string.com_parse_ui_no_email_toast);
} else if (name != null && name.length() == 0) {
} else if (name != null && name.length() == 0 && config.isParseSignupNameFieldEnabled()) {
showToast(R.string.com_parse_ui_no_name_toast);
} else {
ParseUser user = new ParseUser();
Expand All @@ -183,7 +186,7 @@ public void onClick(View v) {
user.setEmail(email);

// Set additional custom fields only if the user filled it out
if (name.length() != 0) {
if (name.length() != 0 && config.isParseSignupNameFieldEnabled()) {
user.put(USER_OBJECT_NAME_FIELD, name);
}

Expand Down
42 changes: 42 additions & 0 deletions ParseUI-Login/src/main/res/values-ko/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<resources>

<string name="com_parse_ui_progress_dialog_text">불러오는중...</string>
<string name="com_parse_ui_username_input_hint">아이디</string>
<string name="com_parse_ui_password_input_hint">암호</string>
<string name="com_parse_ui_forgot_password_button_label"><u>암호를 잃어버렸나요?</u></string>
<string name="com_parse_ui_parse_login_button_label">로그인</string>
<string name="com_parse_ui_parse_signup_button_label">새로 등록</string>
<string name="com_parse_ui_facebook_login_button_label">Facebook으로 로그인</string>
<string name="com_parse_ui_twitter_login_button_label">Twitter로 로그인</string>
<string name="com_parse_ui_email_input_hint">이메일</string>
<string name="com_parse_ui_confirm_password_input_hint">암호 확인</string>
<string name="com_parse_ui_name_input_hint">아이디</string>
<string name="com_parse_ui_create_account_button_label">아이디 생성</string>
<string name="com_parse_ui_no_username_toast">아이디를 입력해 주세요</string>
<string name="com_parse_ui_no_password_toast">암호를 입력해 주세요</string>
<string name="com_parse_ui_parse_login_invalid_credentials_toast">입력한 아이디 또는 암호가 맞지 않습니다</string>
<string name="com_parse_ui_parse_login_failed_unknown_toast">로그인 실패, 잠시 후 다시 시도해 보세요</string>
<string name="com_parse_ui_facebook_login_failed_toast">Facebook 로그인 실패</string>
<string name="com_parse_ui_twitter_login_failed_toast">Twitter 로그인 실패</string>

<plurals name="com_parse_ui_password_too_short_toast">
<item quantity="one">암호는 %d 자 이상 입력해 주세요</item>
<item quantity="other">암호는 %d 자 이상 입력해 주세요</item>
</plurals>

<string name="com_parse_ui_username_taken_toast">이미 존재하는 아이디입니다. 다른 아이디를 입력해 주세요</string>
<string name="com_parse_ui_reenter_password_toast">암호 확인 창에 암호를 한번 더 입력해 주세요</string>
<string name="com_parse_ui_mismatch_confirm_password_toast">암호가 맞지 않습니다. 다시 시도해 보세요</string>
<string name="com_parse_ui_no_email_toast">이메일을 입력해 주세요</string>
<string name="com_parse_ui_invalid_email_toast">잘못된 이메일입니다. 수정후 다시 시도해 보세요</string>
<string name="com_parse_ui_email_taken_toast">이미 사용중인 이메일 입니다. 암호를 재설정 해 보세요</string>
<string name="com_parse_ui_no_name_toast">아이디를 입력해 주세요</string>
<string name="com_parse_ui_signup_failed_unknown_toast">등록에 실패했습니다. 잠시 후 다시 시도해 보세요</string>
<string name="com_parse_ui_login_help_instructions">암호를 재설정 하려면 귀하의 이메일 주소를 입력해 주세요</string>
<string name="com_parse_ui_login_help_email_input_hint">이메일</string>
<string name="com_parse_ui_login_help_submit_button_label">제출</string>
<string name="com_parse_ui_login_help_login_again_button_label">로그인 화면으로 복귀</string>
<string name="com_parse_ui_login_help_submit_failed_unknown">암호 재설정 요청 실패, 다시 시도해 보세요</string>
<string name="com_parse_ui_login_help_email_sent">귀하의 아이디를 되찾을 방법이 적힌 이메일이 발송되었습니다. 메일을 확인해 보세요</string>

</resources>
62 changes: 62 additions & 0 deletions ParseUI-Login/src/main/res/values-pt/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<resources>

<string name="com_parse_ui_logo_content_description">Logomarca</string>
<string name="com_parse_ui_progress_dialog_text">Carregando…</string>
<string name="com_parse_ui_username_input_hint">Usuário</string>
<string name="com_parse_ui_password_input_hint">Senha</string>
<string name="com_parse_ui_forgot_password_button_label"><u>Esqueci a senha</u></string>
<string name="com_parse_ui_parse_login_button_label">Entrar</string>
<string name="com_parse_ui_parse_signup_button_label">Cadastrar</string>
<string name="com_parse_ui_facebook_login_button_label">Entrar com Facebook</string>
<string name="com_parse_ui_twitter_login_button_label">Entrar com Twitter</string>
<string name="com_parse_ui_email_input_hint">E-mail</string>
<string name="com_parse_ui_confirm_password_input_hint">Confirmar senha</string>
<string name="com_parse_ui_name_input_hint">Nome</string>
<string name="com_parse_ui_create_account_button_label">Criar conta</string>
<string name="com_parse_ui_no_username_toast">Informe seu usuário</string>
<string name="com_parse_ui_no_password_toast">Informe sua senha</string>
<string name="com_parse_ui_parse_login_invalid_credentials_toast">Usuário e senha não conferem</string>
<string name="com_parse_ui_parse_login_failed_unknown_toast">Não foi possível entrar, tente novamente mais tarde</string>
<string name="com_parse_ui_facebook_login_failed_toast">Entrar com Facebook falhou</string>
<string name="com_parse_ui_twitter_login_failed_toast">Entrar com Twitter falhou</string>

<plurals name="com_parse_ui_password_too_short_toast">
<item quantity="one">Senha deve conter pelo menos %d caracter</item>
<item quantity="other">Senha deve conter pelo menos %d caracteres</item>
</plurals>

<string name="com_parse_ui_username_taken_toast">Usuário já cadastrado, escolha outro</string>
<string name="com_parse_ui_reenter_password_toast">Informe a senha novamente</string>
<string name="com_parse_ui_mismatch_confirm_password_toast">Senha não confere, tente novamente</string>
<string name="com_parse_ui_no_email_toast">Informe seu e-mail</string>
<string name="com_parse_ui_invalid_email_toast">E-mail inválido, corrija e tente novamente</string>
<string name="com_parse_ui_email_taken_toast">E-mail já foi cadastrado, por favor redefina a sua senha</string>
<string name="com_parse_ui_no_name_toast">Informe seu nome</string>
<string name="com_parse_ui_signup_failed_unknown_toast">Não foi possível cadastrar, tente novamente mais tarde</string>
<string name="com_parse_ui_login_help_instructions">Informe seu e-mail para recuperar sua senha</string>
<string name="com_parse_ui_login_help_email_input_hint">E-mail</string>
<string name="com_parse_ui_login_help_submit_button_label">Enviar</string>
<string name="com_parse_ui_login_help_login_again_button_label">Voltar para o Login</string>
<string name="com_parse_ui_login_help_submit_failed_unknown">Erro ao solicitar recadastramento da senha, tente novamente</string>
<string name="com_parse_ui_login_help_email_sent">Verifique seu e-mail para obter informações sobre como acessar sua conta</string>

<string name="com_parse_ui_login_warning_layout_missing_username_field">Campo usuário faltando no layout</string>
<string name="com_parse_ui_login_warning_layout_missing_password_field">Campo senha faltando no layout</string>
<string name="com_parse_ui_login_warning_layout_missing_login_button">Botão entrar faltando no layout</string>
<string name="com_parse_ui_login_warning_layout_missing_signup_button">Botão cadastrar faltando no layout</string>
<string name="com_parse_ui_login_warning_layout_missing_login_help_button">Botão ajuda faltando no layout</string>
<string name="com_parse_ui_login_warning_disabled_username_password_login">Entrar e cadastrar com usuário e senha desabilitados devido a falta de elementos no layout</string>
<string name="com_parse_ui_login_warning_disabled_facebook_login">Botão de login pelo Facebook faltando no layout, desabilite login pelo Facebook</string>
<string name="com_parse_ui_login_warning_disabled_twitter_login">Botão de login pelo Twitter faltando no layout, desabilite login pelo Twitter</string>
<string name="com_parse_ui_login_warning_parse_login_failed">"Entrar com usuário e senha falhou, exception: "</string>
<string name="com_parse_ui_login_warning_facebook_login_failed">"Login pelo Facebook falhou, exception: "</string>
<string name="com_parse_ui_login_warning_twitter_login_failed">"Login pelo Twitter falhou, exception: "</string>
<string name="com_parse_ui_login_warning_facebook_login_user_update_failed">"Atualizar objeto usuário falhou após o login pelo Facebook, exception: "</string>
<string name="com_parse_ui_login_warning_twitter_login_user_update_failed">"Atualizar objeto usuário falhou após o login pelo Twitter, exception: "</string>
<string name="com_parse_ui_login_warning_parse_signup_failed">"Cadastrar falhou, exception: "</string>
<string name="com_parse_ui_login_warning_password_reset_failed">"Redefinir senha falhou, exception: "</string>

<string name="com_parse_ui_login_dispatch_user_logged_in">"Usuário conectado, iniciando: "</string>
<string name="com_parse_ui_login_dispatch_user_not_logged_in">Usuário não conectado, iniciando ParseLoginActivity</string>

</resources>
42 changes: 42 additions & 0 deletions ParseUI-Login/src/main/res/values-zh/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<resources>

<string name="com_parse_ui_progress_dialog_text">载入中...</string>
<string name="com_parse_ui_username_input_hint">用户名</string>
<string name="com_parse_ui_password_input_hint">密码</string>
<string name="com_parse_ui_forgot_password_button_label"><u>忘记密码</u></string>
<string name="com_parse_ui_parse_login_button_label">登陆</string>
<string name="com_parse_ui_parse_signup_button_label">注册</string>
<string name="com_parse_ui_facebook_login_button_label">使用Facebook登陆</string>
<string name="com_parse_ui_twitter_login_button_label">使用Twitter登陆</string>
<string name="com_parse_ui_email_input_hint">邮箱</string>
<string name="com_parse_ui_confirm_password_input_hint">确认密码</string>
<string name="com_parse_ui_name_input_hint">姓名</string>
<string name="com_parse_ui_create_account_button_label">注册</string>
<string name="com_parse_ui_no_username_toast">请输入用户名</string>
<string name="com_parse_ui_no_password_toast">请输入密码</string>
<string name="com_parse_ui_parse_login_invalid_credentials_toast">用户名密码不匹配</string>
<string name="com_parse_ui_parse_login_failed_unknown_toast">登陆失败,请重试</string>
<string name="com_parse_ui_facebook_login_failed_toast">Facebook登陆失败</string>
<string name="com_parse_ui_twitter_login_failed_toast">Twitter登陆失败</string>

<plurals name="com_parse_ui_password_too_short_toast">
<item quantity="one">密码至少%d个字符</item>
<item quantity="other">密码至少%d个字符</item>
</plurals>

<string name="com_parse_ui_username_taken_toast">用户名已经存在,请换一个重试</string>
<string name="com_parse_ui_reenter_password_toast">请重新输入密码</string>
<string name="com_parse_ui_mismatch_confirm_password_toast">密码不匹配,请重试</string>
<string name="com_parse_ui_no_email_toast">请输入邮箱</string>
<string name="com_parse_ui_invalid_email_toast">邮箱无效,请更正并重试</string>
<string name="com_parse_ui_email_taken_toast">邮箱已经存在,请换一个重试</string>
<string name="com_parse_ui_no_name_toast">请输入姓名</string>
<string name="com_parse_ui_signup_failed_unknown_toast">注册失败,请稍后重试</string>
<string name="com_parse_ui_login_help_instructions">输入邮箱找回密码</string>
<string name="com_parse_ui_login_help_email_input_hint">邮箱</string>
<string name="com_parse_ui_login_help_submit_button_label">提交</string>
<string name="com_parse_ui_login_help_login_again_button_label">返回登陆</string>
<string name="com_parse_ui_login_help_submit_failed_unknown">重置密码失败,请重试</string>
<string name="com_parse_ui_login_help_email_sent">重置密码邮件已发送,请检查邮箱</string>

</resources>
3 changes: 2 additions & 1 deletion ParseUI-Widget/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import com.android.builder.core.BuilderConstants
apply plugin: 'com.android.library'

version = "0.0.1"
group = 'com.parse'

dependencies {
compile 'com.parse:parse-android:1.10.3'
Expand Down Expand Up @@ -109,7 +110,7 @@ uploadArchives {

licenses {
license {
name 'BSD License'
name 'Platform License'
url 'https://github.com/ParsePlatform/ParseUI-Android/blob/master/LICENSE'
distribution 'repo'
}
Expand Down
Loading