Browse Source

initial upload

tags/0.1.0
David Development 5 years ago
parent
commit
232336741d

+ 1
- 0
.gitignore View File

@@ -0,0 +1 @@
/build

+ 78
- 0
AccountImporter.iml View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="News-Android-App" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="android-gradle" name="Android-Gradle">
<configuration>
<option name="GRADLE_PROJECT_PATH" value=":AccountImporter" />
</configuration>
</facet>
<facet type="android" name="Android">
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="debug" />
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugJava" />
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />
<option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
<option name="LIBRARY_PROJECT" value="true" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/build/classes/debug" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/build/source/r/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/source/r/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/test/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/apk" />
<excludeFolder url="file://$MODULE_DIR$/build/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/bundles" />
<excludeFolder url="file://$MODULE_DIR$/build/classes" />
<excludeFolder url="file://$MODULE_DIR$/build/dependency-cache" />
<excludeFolder url="file://$MODULE_DIR$/build/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/libs" />
<excludeFolder url="file://$MODULE_DIR$/build/manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/res" />
<excludeFolder url="file://$MODULE_DIR$/build/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<orderEntry type="jdk" jdkName="Android API 19 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" name="support-v4-19.0.1" level="project" />
<orderEntry type="library" exported="" name="actionbarsherlock-4.4.0" level="project" />
</component>
</module>


+ 27
- 0
build.gradle View File

@@ -0,0 +1,27 @@
apply plugin: 'android-library'

android {
compileSdkVersion 19
buildToolsVersion "19.0.0"

defaultConfig {
packageName "de.luhmer.owncloud.accountimporter"
minSdkVersion 7
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile 'com.android.support:support-v4:19.0.+'
compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'

compile fileTree(dir: 'libs', include: ['*.jar'])
}

+ 17
- 0
proguard-rules.pro View File

@@ -0,0 +1,17 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:/Program Files/Android/android-studio/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

+ 10
- 0
src/main/AndroidManifest.xml View File

@@ -0,0 +1,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.luhmer.owncloud.accountimporter">

<application
android:label="@string/app_name"
android:icon="@drawable/ic_launcher">

</application>

</manifest>

+ 101
- 0
src/main/java/de/luhmer/owncloud/accountimporter/ImportAccountsDialogFragment.java View File

@@ -0,0 +1,101 @@
package de.luhmer.owncloud.accountimporter;

import android.accounts.Account;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.Checkable;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

import de.luhmer.owncloud.accountimporter.adapter.AccountImporterAdapter;
import de.luhmer.owncloud.accountimporter.helper.AccountImporter;
import de.luhmer.owncloud.accountimporter.interfaces.IAccountImport;


/**
* Created by David on 16.05.2014.
*/
@SuppressLint("ValidFragment")
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class ImportAccountsDialogFragment extends DialogFragment {

public IAccountImport accountImport;

public static void show(FragmentActivity activity, IAccountImport accountImport) {
ImportAccountsDialogFragment selectDialogFragment = newInstance(accountImport);
selectDialogFragment.show(activity.getSupportFragmentManager(), "dialog");
}

private static ImportAccountsDialogFragment newInstance(IAccountImport accountImport) {
return new ImportAccountsDialogFragment(accountImport);
}

@SuppressLint("ValidFragment")
public ImportAccountsDialogFragment(IAccountImport accountImport) {
this.accountImport = accountImport;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View view = getActivity().getLayoutInflater().inflate(R.layout.import_accounts_fragment, null);

lvAccounts = (ListView) view.findViewById(R.id.lvAccounts);

final List<Account> accounts = AccountImporter.findAccounts(getActivity());
List<AccountImporterAdapter.SingleAccount> accountList = new ArrayList<AccountImporterAdapter.SingleAccount>();
for(Account account : accounts) {
accountList.add(new AccountImporterAdapter.SingleAccount(account.type, account.name, false));
}

lvAccounts.setAdapter(new AccountImporterAdapter(getActivity(), accountList.toArray(new AccountImporterAdapter.SingleAccount[accountList.size()]), lvAccounts));

lvAccounts.setItemsCanFocus(false);
lvAccounts.setChoiceMode(ListView.CHOICE_MODE_SINGLE);


return new AlertDialog.Builder(getActivity())
.setView(view)
.setTitle(R.string.import_account_dialog_title)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int x) {

for (int i = 0; i < lvAccounts.getAdapter().getCount(); i++) {
if (lvAccounts.getChildAt(i) instanceof Checkable && ((Checkable) lvAccounts.getChildAt(i)).isChecked()) {

AccountImporter.getAuthTokenForAccount(getActivity(), accounts.get(i), accountImport);

/*
Intent intent = new Intent(getActivity(), LoginActivity.class);
//intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
intent.putExtra(LoginActivity.NEW_ACCOUNT, true);
intent.putExtra(URL_STRING, calendars.get(i));
intent.putExtra(USERNAME_STRING, username);
intent.putExtra(PASSWORD_STRING, password);
startActivity(intent);
*/
}
}
}
})
.setNegativeButton(android.R.string.no, null)
.create();
}

ListView lvAccounts;



}

+ 103
- 0
src/main/java/de/luhmer/owncloud/accountimporter/adapter/AccountImporterAdapter.java View File

@@ -0,0 +1,103 @@
package de.luhmer.owncloud.accountimporter.adapter;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;

import de.luhmer.owncloud.accountimporter.R;
import de.luhmer.owncloud.accountimporter.helper.CheckableLinearLayout;

/**
* Created by David on 29.05.2014.
*/
public class AccountImporterAdapter extends ArrayAdapter<AccountImporterAdapter.SingleAccount> implements AdapterView.OnItemClickListener {

Context context;
LayoutInflater inflater;

public AccountImporterAdapter(Activity context, SingleAccount[] accounts, ListView listView) {
super(context, R.layout.simple_list_item_single_choice, accounts);
this.context = context;

listView.setOnItemClickListener(this);

inflater = context.getLayoutInflater();
}

@Override
public View getView(final int position, View view, ViewGroup parent) {
ViewHolder holder;

if (view != null) {
holder = (ViewHolder) view.getTag();
} else {
view = inflater.inflate(R.layout.simple_list_item_single_choice, parent, false);
TextView text1 = (TextView) view.findViewById(R.id.text1);
TextView text2 = (TextView) view.findViewById(R.id.text2);
CheckBox cbChecked = (CheckBox) view.findViewById(R.id.checkbox);
holder = new ViewHolder(text1, text2, cbChecked);

view.setTag(holder);
}

holder.text1.setText(getItem(position).type);
holder.text2.setText(getItem(position).url);
holder.cbChecked.setChecked(getItem(position).checked);


return view;
}

@Override
public void onItemClick(AdapterView<?> adapterView, View view, int id, long l) {
for (int i = 0; i < getCount(); i++) {
getItem(i).checked = false;
}
((CheckableLinearLayout)view).toggle();


view.findViewById(R.id.text1);

notifyDataSetChanged();
}



static class ViewHolder {
TextView text1;
TextView text2;
CheckBox cbChecked;

public ViewHolder(TextView text1, TextView text2,CheckBox cbChecked) {
this.text1 = text1;
this.text2 = text2;
this.cbChecked = cbChecked;
}
}





public static class SingleAccount {

public SingleAccount(String type, String url, Boolean checked) {
this.type = type;
this.url = url;
this.checked = checked;
}

public String type;
public String url;

public boolean checked;
}

}

+ 154
- 0
src/main/java/de/luhmer/owncloud/accountimporter/helper/AccountImporter.java View File

@@ -0,0 +1,154 @@
package de.luhmer.owncloud.accountimporter.helper;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.accounts.OperationCanceledException;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.os.Handler;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import de.luhmer.owncloud.accountimporter.ImportAccountsDialogFragment;
import de.luhmer.owncloud.accountimporter.interfaces.IAccountImport;

/**
* Created by david on 28.05.14.
*/
public class AccountImporter {

public static List<Account> findAccounts(Activity activity) {
final AccountManager accMgr = AccountManager.get(activity);
final Account[] accounts = accMgr.getAccounts();

List<Account> accountsAvailable = new ArrayList<Account>();
for (Account account : accounts) {
String aType = account.type.intern();

if (//aType.equals("org.dmfs.caldav.account") ||
// aType.equals("org.dmfs.carddav.account") ||
aType.equals("de.luhmer.tasksync") ||
aType.equals("owncloud")) {
//accountsAvailable.add(accounts[index].type);
accountsAvailable.add(account);
}
}

return accountsAvailable;
}




public static void getAuthTokenForAccount(Activity activity, final Account account, final IAccountImport accountImport) {


final AccountManager accMgr = AccountManager.get(activity);
/*
accMgr.getAuthToken(account, AccountGeneral.ACCOUNT_TYPE, null, activity, new AccountManagerCallback<Bundle>() {
public void run(AccountManagerFuture<Bundle> future) {
try {
// If the user has authorized your application to use the tasks API
// a token is available.
String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
// Now you can use the Tasks API...
if(accountImport != null) {
accountImport.accountAccessGranted(account, token);
}
} catch (OperationCanceledException e) {
e.printStackTrace();
// TODO: The user has denied you access to the API, you should handle that
} catch (Exception e) {
e.printStackTrace();
}
}
}, null);
*/


/*
if(accountImport != null) {
accountImport.accountAccessGranted(account, null);
}
*/

//accMgr.invalidateAuthToken(account.type, AccountGeneral.ACCOUNT_TYPE);
//accMgr.invalidateAuthToken(account.type, null);

final AlertDialog aDialog = new AlertDialog.Builder(activity)
.setTitle("Account Importer")
.setMessage("Please grant access to the selected account in the notification bar!")
.create();

aDialog.show();

String authTokenType;
if(account.type.equals("owncloud")) {
authTokenType = "owncloud.password";
} else {
authTokenType = "de.luhmer.tasksync";
}


final Handler handler = new Handler();
accMgr.getAuthToken(account, authTokenType, true,
new AccountManagerCallback<Bundle>() {

@Override
public void run(AccountManagerFuture<Bundle> future) {

try {
// If the user has authorized your application to use the tasks API
// a token is available.
//String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
// Now you can use the Tasks API...
if(accountImport != null) {
accountImport.accountAccessGranted(HandleResult(account, future.getResult()));
}
} catch (OperationCanceledException e) {
e.printStackTrace();
// TODO: The user has denied you access to the API, you should handle that
} catch (Exception e) {
e.printStackTrace();
}

aDialog.dismiss();

}
}, handler

);
}

private static OwnCloudAccount HandleResult(Account account, Bundle data) {
int lastAtPos = account.name.lastIndexOf("@");
String urlString = account.name.substring(lastAtPos + 1);
String username = account.name.substring(0, lastAtPos);

if(!urlString.startsWith("http"))
urlString = "https://" + urlString;

String password = data.getString(AccountManager.KEY_AUTHTOKEN);


try {
final String urlStringOrig = urlString;
URL url = new URL(urlStringOrig);
urlString = url.getProtocol() + "://" + url.getHost();
if(url.getPath().contains("/owncloud")) {
urlString += url.getPath().substring(0, url.getPath().indexOf("/owncloud") + 9);
} else if(url.getPath().contains("/")) {
urlString += url.getPath().substring(0, url.getPath().indexOf("/"));
}
} catch(Exception ex) {
ex.printStackTrace();
}

return new OwnCloudAccount(username, password, urlString);
}
}

+ 53
- 0
src/main/java/de/luhmer/owncloud/accountimporter/helper/CheckableLinearLayout.java View File

@@ -0,0 +1,53 @@
package de.luhmer.owncloud.accountimporter.helper;


import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
import android.widget.Checkable;
import android.widget.LinearLayout;

/**
* Created by David on 29.05.2014.
*/

public class CheckableLinearLayout extends LinearLayout implements Checkable {
private CheckBox _checkbox;

public CheckableLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected void onFinishInflate() {
super.onFinishInflate();
// find checked text view
int childCount = getChildCount();
for (int i = 0; i < childCount; ++i) {
View v = getChildAt(i);
if (v instanceof CheckBox) {
_checkbox = (CheckBox)v;
}
}
}

@Override
public boolean isChecked() {
return _checkbox != null ? _checkbox.isChecked() : false;
}

@Override
public void setChecked(boolean checked) {
if (_checkbox != null) {
_checkbox.setChecked(checked);
}
}

@Override
public void toggle() {
if (_checkbox != null) {
_checkbox.toggle();
}
}
}

+ 38
- 0
src/main/java/de/luhmer/owncloud/accountimporter/helper/OwnCloudAccount.java View File

@@ -0,0 +1,38 @@
package de.luhmer.owncloud.accountimporter.helper;

import java.util.regex.Pattern;

import de.luhmer.owncloud.accountimporter.ImportAccountsDialogFragment;

/**
* Created by David on 05.06.2014.
*/
public class OwnCloudAccount {
String url;
String username;
String password;

public OwnCloudAccount(String username, String password, String url) {
this.username = username;
this.password = password;
this.url = validateURL(url);
}

public String getUrl() {
return url;
}

public String getUsername() {
return username;
}

public String getPassword() {
return password;
}


static final Pattern RemoveAllDoubleSlashes = Pattern.compile("(?<!:)\\/\\/");
public static String validateURL(String url) {
return RemoveAllDoubleSlashes.matcher(url).replaceAll("/");
}
}

+ 15
- 0
src/main/java/de/luhmer/owncloud/accountimporter/interfaces/IAccountImport.java View File

@@ -0,0 +1,15 @@
package de.luhmer.owncloud.accountimporter.interfaces;

import android.accounts.Account;
import android.os.Bundle;

import de.luhmer.owncloud.accountimporter.helper.OwnCloudAccount;

/**
* Created by David on 28.05.2014.
*/
public interface IAccountImport {
//public void accountAccessGranted(Account account, Bundle data);

public void accountAccessGranted(OwnCloudAccount account);
}

BIN
src/main/res/drawable-hdpi/ic_launcher.png View File


BIN
src/main/res/drawable-mdpi/ic_launcher.png View File


BIN
src/main/res/drawable-xhdpi/ic_launcher.png View File


BIN
src/main/res/drawable-xxhdpi/ic_launcher.png View File


+ 23
- 0
src/main/res/layout/import_accounts_fragment.xml View File

@@ -0,0 +1,23 @@
<?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">


<ListView
android:id="@+id/lvAccounts"
android:layout_width="match_parent"
android:layout_height="match_parent" />


<!--
<ProgressBar
android:id="@+id/pbProgress"
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"/>

-->
</LinearLayout>

+ 74
- 0
src/main/res/layout/simple_list_item_single_choice.xml View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<de.luhmer.owncloud.accountimporter.helper.CheckableLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="5dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:orientation="horizontal" >

<LinearLayout
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:text="dahsjkfasd"
android:textSize="17dp"
android:gravity="center_vertical" />

<TextView
android:id="@+id/text2"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:text="dsfjhkafadsjhkas@fdsjfk hld lfdhsjkfldh sajkflh jdaskfhjdkla sfhjdksla fhl"
android:singleLine="true"
android:ellipsize="middle"
android:gravity="center_vertical"
android:textSize="15dp"/>
</LinearLayout>

<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:focusable="false"/>

</de.luhmer.owncloud.accountimporter.helper.CheckableLinearLayout>

<!--
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeightSmall"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:maxLines="2"
android:ellipsize="marquee"
/>
-->

+ 7
- 0
src/main/res/values/strings.xml View File

@@ -0,0 +1,7 @@
<resources>
<string name="app_name">ownCloud Account Importer</string>

<!-- Import Accounts -->
<string name="import_account_dialog_title">Import Account</string>

</resources>

Loading…
Cancel
Save