From f83eebe4dd69f080db5042c36579c40910c576b7 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 23 Mar 2017 20:16:31 +0100 Subject: [PATCH] Drawer, Toolbar and minor UI optimizations (#145) * initial add of toolbar and hamburger menu to main activity * toolbar added to preferences and accounts screens * fixed original string (name) * Layout fix for content * initial add of toolbar and hamburger menu to main activity * remove unnecessary padding bottom * fix styling and paint login activity in blue * toolbar added to preferences and accounts screens * Layout fix for content * remove unnecessary padding bottom * fix styling and paint login activity in blue * fixes after rebase * consolidate style since minVersion=16, make drawer to be behind the systembar * optimize drawer header * add back navigation to login activity, fix spinner background * add back navigation * more launcher icon to mipmap folders * fix identation * fix license header * revert code style deletion, change identation * proper notification icon * proper resolution for login logo * fix large notification icon * removed unused Eclair switch since support is v16+ * only use small notification icon * spaces->tabs * fix toolbar style for Android 4.x --- notification_icon.svg | 51 ++++ src/main/AndroidManifest.xml | 6 +- .../activities/LoginActivity.java | 116 ++++---- .../owncloud_sms/activities/MainActivity.java | 270 +++++++++++------- .../activities/OCSMSSettingsActivity.java | 168 ++++++----- .../AccountActionsActivity.java | 32 ++- .../remote_account/AccountListActivity.java | 25 +- .../RestoreMessagesActivity.java | 21 +- .../notifications/OCSMSNotificationUI.java | 40 +-- src/main/res/drawable-hdpi/logo.png | Bin 0 -> 2049 bytes .../res/drawable-hdpi/notification_icon.png | Bin 0 -> 586 bytes src/main/res/drawable-mdpi/logo.png | Bin 0 -> 1351 bytes .../res/drawable-mdpi/notification_icon.png | Bin 0 -> 446 bytes src/main/res/drawable-xhdpi/logo.png | Bin 0 -> 2839 bytes .../res/drawable-xhdpi/notification_icon.png | Bin 0 -> 701 bytes src/main/res/drawable-xxhdpi/logo.png | Bin 0 -> 4472 bytes .../res/drawable-xxhdpi/notification_icon.png | Bin 0 -> 1071 bytes src/main/res/drawable-xxxhdpi/logo.png | Bin 0 -> 6197 bytes .../drawable-xxxhdpi/notification_icon.png | Bin 0 -> 1367 bytes src/main/res/layout/activity_login.xml | 16 +- src/main/res/layout/activity_main.xml | 31 +- src/main/res/layout/nav_header_main.xml | 9 +- .../res/layout/recovery_phone_list_item.xml | 4 +- .../styles.xml => layout/toolbar.xml} | 33 ++- .../ic_launcher.png | Bin .../ic_launcher.png | Bin .../ic_launcher.png | Bin .../ic_launcher.png | Bin src/main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 4224 bytes src/main/res/values-en/strings.xml | 2 +- src/main/res/values-v21/styles.xml | 22 +- src/main/res/values-w820dp/dimens.xml | 2 +- src/main/res/values/colors.xml | 3 + src/main/res/values/dimens.xml | 3 +- src/main/res/values/styles.xml | 38 ++- 35 files changed, 570 insertions(+), 322 deletions(-) create mode 100644 notification_icon.svg create mode 100644 src/main/res/drawable-hdpi/logo.png create mode 100644 src/main/res/drawable-hdpi/notification_icon.png create mode 100644 src/main/res/drawable-mdpi/logo.png create mode 100644 src/main/res/drawable-mdpi/notification_icon.png create mode 100644 src/main/res/drawable-xhdpi/logo.png create mode 100644 src/main/res/drawable-xhdpi/notification_icon.png create mode 100644 src/main/res/drawable-xxhdpi/logo.png create mode 100644 src/main/res/drawable-xxhdpi/notification_icon.png create mode 100644 src/main/res/drawable-xxxhdpi/logo.png create mode 100644 src/main/res/drawable-xxxhdpi/notification_icon.png rename src/main/res/{values-v14/styles.xml => layout/toolbar.xml} (56%) rename src/main/res/{drawable-hdpi => mipmap-hdpi}/ic_launcher.png (100%) rename src/main/res/{drawable-mdpi => mipmap-mdpi}/ic_launcher.png (100%) rename src/main/res/{drawable-xhdpi => mipmap-xhdpi}/ic_launcher.png (100%) rename src/main/res/{drawable-xxhdpi => mipmap-xxhdpi}/ic_launcher.png (100%) create mode 100644 src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/notification_icon.svg b/notification_icon.svg new file mode 100644 index 0000000..c8dd3fa --- /dev/null +++ b/notification_icon.svg @@ -0,0 +1,51 @@ + +image/svg+xml \ No newline at end of file diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 09995bf..aa06d96 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -124,7 +124,8 @@ + android:label="@string/title_activity_login" + android:theme="@style/OcSmsTheme.Login"> + android:label="@string/app_name" + android:theme="@style/OcSmsTheme.Drawer"> diff --git a/src/main/java/fr/unix_experience/owncloud_sms/activities/LoginActivity.java b/src/main/java/fr/unix_experience/owncloud_sms/activities/LoginActivity.java index 1b9a0f7..3646ec1 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/activities/LoginActivity.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/activities/LoginActivity.java @@ -29,10 +29,12 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.provider.Settings; +import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; +import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.inputmethod.EditorInfo; @@ -65,7 +67,7 @@ public class LoginActivity extends AppCompatActivity { private EditText _loginView; private EditText _passwordView; private EditText _serverView; - private ActionProcessButton _signInButton; + private ActionProcessButton _signInButton; private View mProgressView; private View mLoginFormView; @@ -74,6 +76,9 @@ public class LoginActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); + ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayHomeAsUpEnabled(true); + // Set up the login form. _protocolView = (Spinner) findViewById(R.id.oc_protocol); _serverView = (EditText) findViewById(R.id.oc_server); @@ -84,7 +89,7 @@ public class LoginActivity extends AppCompatActivity { .setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int id, - KeyEvent keyEvent) { + KeyEvent keyEvent) { if ((id == R.id.oc_login) || (id == EditorInfo.IME_NULL)) { attemptLogin(); return true; @@ -93,7 +98,7 @@ public class LoginActivity extends AppCompatActivity { } }); - _signInButton = (ActionProcessButton) findViewById(R.id.oc_signin_button); + _signInButton = (ActionProcessButton) findViewById(R.id.oc_signin_button); _signInButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { @@ -105,6 +110,19 @@ public class LoginActivity extends AppCompatActivity { mProgressView = findViewById(R.id.login_progress); } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + boolean retval = true; + switch (item.getItemId()) { + case android.R.id.home: + finish(); + break; + default: + retval = super.onOptionsItemSelected(item); + } + return retval; + } + /** * Attempts to sign in or register the account specified by the login form. * If there are form errors (invalid email, missing fields, etc.), the @@ -127,12 +145,12 @@ public class LoginActivity extends AppCompatActivity { boolean cancel = false; View focusView = null; - + // Check for a valid server address. if (TextUtils.isEmpty(protocol)) { cancel = true; } - + // Check for a valid server address. if (TextUtils.isEmpty(serverAddr)) { _serverView.setError(getString(R.string.error_field_required)); @@ -146,14 +164,14 @@ public class LoginActivity extends AppCompatActivity { focusView = _loginView; cancel = true; } - + // Check for a valid password if (TextUtils.isEmpty(password)) { _passwordView.setError(getString(R.string.error_field_required)); focusView = _passwordView; cancel = true; } - + if (!isPasswordValid(password)) { _passwordView.setError(getString(R.string.error_invalid_password)); focusView = _passwordView; @@ -163,15 +181,15 @@ public class LoginActivity extends AppCompatActivity { if (cancel) { // There was an error; don't attempt login and focus the first // form field with an error. - // reset the button progress - _signInButton.setProgress(0); - if (focusView != null) { - focusView.requestFocus(); - } - } else { + // reset the button progress + _signInButton.setProgress(0); + if (focusView != null) { + focusView.requestFocus(); + } + } else { // Show a progress spinner, and kick off a background task to // perform the user login attempt. - _signInButton.setProgress(25); + _signInButton.setProgress(25); showProgress(true); String serverURL = protocol + serverAddr; mAuthTask = new UserLoginTask(serverURL, login, password); @@ -229,10 +247,10 @@ public class LoginActivity extends AppCompatActivity { * Represents an asynchronous login/registration task used to authenticate * the user. */ - public class UserLoginTask extends AsyncTask { + public class UserLoginTask extends AsyncTask { UserLoginTask(String serverURI, String login, String password) { - Log.i(TAG, "_serverURI = " + serverURI); + Log.i(TAG, "_serverURI = " + serverURI); _serverURI = Uri.parse(serverURI); _login = login; _password = password; @@ -259,47 +277,47 @@ public class LoginActivity extends AppCompatActivity { protected void onPostExecute(Boolean success) { mAuthTask = null; showProgress(false); - _signInButton.setProgress(90); + _signInButton.setProgress(90); if (success) { - _signInButton.setProgress(100); + _signInButton.setProgress(100); String accountType = getIntent().getStringExtra(UserLoginTask.PARAM_AUTHTOKEN_TYPE); - if (accountType == null) { - accountType = getString(R.string.account_type); - } - + if (accountType == null) { + accountType = getString(R.string.account_type); + } + // Generate a label String accountLabel = _login + "@" + _serverURI.getHost(); - + // We create the account Account account = new Account(accountLabel, accountType); Bundle accountBundle = new Bundle(); accountBundle.putString("ocLogin", _login); accountBundle.putString("ocURI", _serverURI.toString()); - + // And we push it to Android AccountManager accMgr = AccountManager.get(getApplicationContext()); - accMgr.addAccountExplicitly(account, _password, accountBundle); - + accMgr.addAccountExplicitly(account, _password, accountBundle); + // Set sync options ContentResolver.setSyncAutomatically(account, getString(R.string.account_authority), true); - + Bundle b = new Bundle(); b.putInt("synctype", 1); - + ContentResolver.addPeriodicSync(account, getString(R.string.account_authority), b, DefaultPrefs.syncInterval * 60); // Then it's finished finish(); - + // Start sync settings, we have finished to configure account Intent settingsIntent = new Intent(Settings.ACTION_SYNC_SETTINGS); settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getApplicationContext().startActivity(settingsIntent); } else { - boolean serverViewRequestFocus = true; + boolean serverViewRequestFocus = true; switch (_returnCode) { case 0: - _serverView.setError("UNK"); + _serverView.setError("UNK"); break; case 404: _serverView.setError(getString(R.string.error_connection_failed_not_found)); @@ -312,24 +330,24 @@ public class LoginActivity extends AppCompatActivity { _serverView.setError(getString(R.string.error_http_connection_failed)); break; case 401: - case 403: - _passwordView.setError(getString(R.string.error_invalid_login)); - _passwordView.requestFocus(); - // Warning, there is no break here to disable serverViewRequestFocus too - case 200: - default: - serverViewRequestFocus = false; - break; + case 403: + _passwordView.setError(getString(R.string.error_invalid_login)); + _passwordView.requestFocus(); + // Warning, there is no break here to disable serverViewRequestFocus too + case 200: + default: + serverViewRequestFocus = false; + break; } - if (serverViewRequestFocus) { - _serverView.requestFocus(); - } + if (serverViewRequestFocus) { + _serverView.requestFocus(); + } - // If not ok, reset the progress - if (_returnCode != 200) { - _signInButton.setProgress(0); - } + // If not ok, reset the progress + if (_returnCode != 200) { + _signInButton.setProgress(0); + } } } @@ -343,8 +361,8 @@ public class LoginActivity extends AppCompatActivity { private final String _login; private final String _password; private int _returnCode; - + static final String PARAM_AUTHTOKEN_TYPE = "auth.token"; - private final String TAG = UserLoginTask.class.getCanonicalName(); - } + private final String TAG = UserLoginTask.class.getCanonicalName(); + } } diff --git a/src/main/java/fr/unix_experience/owncloud_sms/activities/MainActivity.java b/src/main/java/fr/unix_experience/owncloud_sms/activities/MainActivity.java index d06f6eb..05aa9ec 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/activities/MainActivity.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/activities/MainActivity.java @@ -38,6 +38,7 @@ import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.MenuItem; import android.view.Window; @@ -59,107 +60,174 @@ import static fr.unix_experience.owncloud_sms.enums.PermissionID.REQUEST_MAX; import static fr.unix_experience.owncloud_sms.enums.PermissionID.REQUEST_SMS; public class MainActivity extends AppCompatActivity - implements NavigationView.OnNavigationItemSelectedListener{ + implements NavigationView.OnNavigationItemSelectedListener { + + private ConnectivityMonitor _ConnectivityMonitor = null; + + private DrawerLayout drawer; - private ConnectivityMonitor _ConnectivityMonitor = null; @Override protected void onCreate(Bundle savedInstanceState) { - if (_ConnectivityMonitor == null) { - _ConnectivityMonitor = new ConnectivityMonitor(getApplicationContext()); - } + if (_ConnectivityMonitor == null) { + _ConnectivityMonitor = new ConnectivityMonitor(getApplicationContext()); + } - requestWindowFeature(Window.FEATURE_NO_TITLE); + requestWindowFeature(Window.FEATURE_NO_TITLE); - super.onCreate(savedInstanceState); + super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); - ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( - this, drawer, null, R.string.navigation_drawer_open, R.string.navigation_drawer_close); - assert drawer != null; - drawer.addDrawerListener(toggle); - toggle.syncState(); - NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); - assert navigationView != null; - navigationView.setNavigationItemSelectedListener(this); + setupToolbar(); + getSupportActionBar().setHomeButtonEnabled(true); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); - drawer.openDrawer(GravityCompat.START); + drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + setupDrawer(); + drawer.openDrawer(GravityCompat.START); } - @Override - public void onBackPressed() { - DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); - assert drawer != null; - if (drawer.isDrawerOpen(GravityCompat.START)) { - drawer.closeDrawer(GravityCompat.START); - } else { - super.onBackPressed(); - } - } + protected void setupToolbar() { + setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); + } - @Override - public boolean onNavigationItemSelected(MenuItem item) { - int id = item.getItemId(); - boolean res = true; + private void setupDrawer() { + ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( + this, drawer, null, R.string.navigation_drawer_open, R.string.navigation_drawer_close); + assert drawer != null; + drawer.addDrawerListener(toggle); + toggle.syncState(); + toggle.setDrawerIndicatorEnabled(true); - switch (id) { - case R.id.nav_sync: syncAllMessages(); break; - case R.id.nav_manage: res = openAppSettings(); break; - case R.id.nav_rateus: res = openGooglePlayStore(); break; - case R.id.nav_add_account: res = openAddAccount(); break; - case R.id.nav_my_accounts: res = openMyAccounts(); break; - case R.id.nav_appinfo_perms: res = openAppInfos(); break; - } - DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); - assert drawer != null; - drawer.closeDrawer(GravityCompat.START); - return res; - } + NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); + assert navigationView != null; + navigationView.setNavigationItemSelectedListener(this); + } - private boolean openAppSettings () { + /** + * checks if the drawer exists and is opened. + * + * @return true if the drawer is open, else false + */ + public boolean isDrawerOpen() { + return drawer != null && drawer.isDrawerOpen(GravityCompat.START); + } + + /** + * closes the drawer. + */ + public void closeDrawer() { + if (drawer != null) { + drawer.closeDrawer(GravityCompat.START); + } + } + + /** + * opens the drawer. + */ + public void openDrawer() { + if (drawer != null) { + drawer.openDrawer(GravityCompat.START); + } + } + + @Override + public void onBackPressed() { + if (isDrawerOpen()) { + closeDrawer(); + } else { + super.onBackPressed(); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + boolean retval = true; + switch (item.getItemId()) { + case android.R.id.home: { + if (isDrawerOpen()) { + closeDrawer(); + } else { + openDrawer(); + } + break; + } + default: + retval = super.onOptionsItemSelected(item); + } + return retval; + } + + @Override + public boolean onNavigationItemSelected(MenuItem item) { + int id = item.getItemId(); + boolean res = true; + + switch (id) { + case R.id.nav_sync: + syncAllMessages(); + break; + case R.id.nav_manage: + res = openAppSettings(); + break; + case R.id.nav_rateus: + res = openGooglePlayStore(); + break; + case R.id.nav_add_account: + res = openAddAccount(); + break; + case R.id.nav_my_accounts: + res = openMyAccounts(); + break; + case R.id.nav_appinfo_perms: + res = openAppInfos(); + break; + } + closeDrawer(); + return res; + } + + private boolean openAppSettings() { startActivity(new Intent(this, OCSMSSettingsActivity.class)); - return true; + return true; } - private boolean openAddAccount () { + private boolean openAddAccount() { startActivity(new Intent(Settings.ACTION_ADD_ACCOUNT)); - return true; + return true; } - public void syncAllMessages () { - Log.v(MainActivity.TAG, "Launch syncAllMessages()"); - if (!PermissionChecker.checkPermission(this, Manifest.permission.READ_SMS, - REQUEST_SMS)) { - return; - } + public void syncAllMessages() { + Log.v(MainActivity.TAG, "Launch syncAllMessages()"); + if (!PermissionChecker.checkPermission(this, Manifest.permission.READ_SMS, + REQUEST_SMS)) { + return; + } Context ctx = getApplicationContext(); if (_ConnectivityMonitor.isValid()) { // Now fetch messages since last stored date JSONArray smsList = new JSONArray(); - new AndroidSmsFetcher(ctx).bufferMessagesSinceDate(smsList, (long) 0); + new AndroidSmsFetcher(ctx).bufferMessagesSinceDate(smsList, (long) 0); if (smsList.length() > 0) { - OCSMSNotificationUI.notify(ctx, ctx.getString(R.string.sync_title), - ctx.getString(R.string.sync_inprogress), OCSMSNotificationType.SYNC.ordinal()); + OCSMSNotificationUI.notify(ctx, ctx.getString(R.string.sync_title), + ctx.getString(R.string.sync_inprogress), OCSMSNotificationType.SYNC.ordinal()); new SyncTask(getApplicationContext(), smsList).execute(); + } else { + Toast.makeText(ctx, ctx.getString(R.string.nothing_to_sync), Toast.LENGTH_SHORT).show(); } - else { - Toast.makeText(ctx, ctx.getString(R.string.nothing_to_sync), Toast.LENGTH_SHORT).show(); - } - } - else { + } else { Toast.makeText(ctx, ctx.getString(R.string.err_sync_no_connection_available), Toast.LENGTH_SHORT).show(); } - Log.v(MainActivity.TAG, "Finish syncAllMessages()"); + Log.v(MainActivity.TAG, "Finish syncAllMessages()"); } - private boolean openMyAccounts () { + private boolean openMyAccounts() { startActivity(new Intent(this, AccountListActivity.class)); - return true; + return true; } - private boolean openGooglePlayStore () { + private boolean openGooglePlayStore() { Intent intent; try { intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + getPackageName())); @@ -168,45 +236,45 @@ public class MainActivity extends AppCompatActivity } startActivity(intent); - return true; + return true; } - private boolean openAppInfos () { - Intent intent = new Intent(); - intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - Uri uri = Uri.fromParts("package", getPackageName(), null); - intent.setData(uri); - startActivity(intent); - return true; - } + private boolean openAppInfos() { + Intent intent = new Intent(); + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + Uri uri = Uri.fromParts("package", getPackageName(), null); + intent.setData(uri); + startActivity(intent); + return true; + } - /* - * Permissions - */ + /* + * Permissions + */ - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, - @NonNull int[] grantResults) { - PermissionID requestCodeID = REQUEST_MAX; - if ((requestCode > 0) || (requestCode < REQUEST_MAX.ordinal())) { - requestCodeID = PermissionID.values()[requestCode]; - } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) { + PermissionID requestCodeID = REQUEST_MAX; + if ((requestCode > 0) || (requestCode < REQUEST_MAX.ordinal())) { + requestCodeID = PermissionID.values()[requestCode]; + } - switch (requestCodeID) { - case REQUEST_SMS: - if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - syncAllMessages(); - } else { - // Permission Denied - Toast.makeText(this, getString(R.string.err_cannot_read_sms) + " " + - getString(R.string.please_fix_it), Toast.LENGTH_SHORT) - .show(); - } - break; - default: - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - } - } + switch (requestCodeID) { + case REQUEST_SMS: + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + syncAllMessages(); + } else { + // Permission Denied + Toast.makeText(this, getString(R.string.err_cannot_read_sms) + " " + + getString(R.string.please_fix_it), Toast.LENGTH_SHORT) + .show(); + } + break; + default: + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } - private static final String TAG = MainActivity.class.getSimpleName(); + private static final String TAG = MainActivity.class.getSimpleName(); } diff --git a/src/main/java/fr/unix_experience/owncloud_sms/activities/OCSMSSettingsActivity.java b/src/main/java/fr/unix_experience/owncloud_sms/activities/OCSMSSettingsActivity.java index 54ab540..0bb8ae0 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/activities/OCSMSSettingsActivity.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/activities/OCSMSSettingsActivity.java @@ -24,7 +24,10 @@ import android.content.ContentResolver; import android.content.PeriodicSync; import android.os.Bundle; import android.preference.ListPreference; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatDelegate; import android.util.Log; +import android.view.MenuItem; import java.util.List; @@ -37,82 +40,104 @@ import fr.unix_experience.owncloud_sms.prefs.PermissionChecker; import static fr.unix_experience.owncloud_sms.enums.PermissionID.REQUEST_ACCOUNTS; public class OCSMSSettingsActivity extends VirtualSettingsActivity { - private static final String TAG = OCSMSSettingsActivity.class.getSimpleName(); + private static final String TAG = OCSMSSettingsActivity.class.getSimpleName(); - private static AccountManager _accountMgr; - private static String _accountAuthority; - private static String _accountType; + private static AccountManager _accountMgr; + private static String _accountAuthority; + private static String _accountType; - @Override - protected void onPostCreate(Bundle savedInstanceState) { - OCSMSSettingsActivity._accountMgr = AccountManager.get(getBaseContext()); - OCSMSSettingsActivity._accountAuthority = getString(R.string.account_authority); - OCSMSSettingsActivity._accountType = getString(R.string.account_type); - VirtualSettingsActivity._prefsRessourceFile = R.xml.pref_data_sync; + private AppCompatDelegate mDelegate; - // Bind our boolean preferences - VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("push_on_receive", DefaultPrefs.pushOnReceive)); - VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("sync_wifi", DefaultPrefs.syncWifi)); - VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("sync_4g", DefaultPrefs.sync4G)); - VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("sync_3g", DefaultPrefs.sync3G)); - VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("sync_gprs", DefaultPrefs.syncGPRS)); - VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("sync_2g", DefaultPrefs.sync2G)); - VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("sync_others", DefaultPrefs.syncOthers)); + @SuppressWarnings("deprecation") + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); - // Bind our string preferences - VirtualSettingsActivity._stringPrefs.add(new BindObjectPref("sync_frequency", "15")); - VirtualSettingsActivity._stringPrefs.add(new BindObjectPref("sync_bulk_messages", "-1")); - VirtualSettingsActivity._stringPrefs.add(new BindObjectPref("minimum_sync_chars", "1")); + ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayHomeAsUpEnabled(true); + } - // Must be at the end, after preference bind - super.onPostCreate(savedInstanceState); - } + private AppCompatDelegate getDelegate() { + if (mDelegate == null) { + mDelegate = AppCompatDelegate.create(this, null); + } + return mDelegate; + } - protected void handleCheckboxPreference(String key, Boolean value) { - // Network types allowed for sync - if ("push_on_receive".equals(key) || - "sync_wifi".equals(key) || "sync_2g".equals(key) || - "sync_3g".equals(key) || "sync_gprs".equals(key) || - "sync_4g".equals(key) || "sync_others".equals(key)) { - OCSMSSharedPrefs prefs = new OCSMSSharedPrefs(VirtualSettingsActivity._context); - Log.i(OCSMSSettingsActivity.TAG, "OCSMSSettingsActivity.handleCheckboxPreference: set " + key + " to " - + value.toString()); - prefs.putBoolean(key, value); - } - } + public ActionBar getSupportActionBar() { + return getDelegate().getSupportActionBar(); + } - protected void handleListPreference(String key, String value, - ListPreference preference) { - // For list preferences, look up the correct display value in - // the preference's 'entries' list. - int index = preference.findIndexOfValue(value); + @Override + protected void onPostCreate(Bundle savedInstanceState) { + OCSMSSettingsActivity._accountMgr = AccountManager.get(getBaseContext()); + OCSMSSettingsActivity._accountAuthority = getString(R.string.account_authority); + OCSMSSettingsActivity._accountType = getString(R.string.account_type); + VirtualSettingsActivity._prefsRessourceFile = R.xml.pref_data_sync; - // Set the summary to reflect the new value. - preference - .setSummary((index >= 0) ? preference.getEntries()[index] - : null); + // Bind our boolean preferences + VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("push_on_receive", DefaultPrefs.pushOnReceive)); + VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("sync_wifi", DefaultPrefs.syncWifi)); + VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("sync_4g", DefaultPrefs.sync4G)); + VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("sync_3g", DefaultPrefs.sync3G)); + VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("sync_gprs", DefaultPrefs.syncGPRS)); + VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("sync_2g", DefaultPrefs.sync2G)); + VirtualSettingsActivity._boolPrefs.add(new BindObjectPref("sync_others", DefaultPrefs.syncOthers)); - Log.i(OCSMSSettingsActivity.TAG, "Modifying listPreference " + key); + // Bind our string preferences + VirtualSettingsActivity._stringPrefs.add(new BindObjectPref("sync_frequency", "15")); + VirtualSettingsActivity._stringPrefs.add(new BindObjectPref("sync_bulk_messages", "-1")); + VirtualSettingsActivity._stringPrefs.add(new BindObjectPref("minimum_sync_chars", "1")); - OCSMSSharedPrefs prefs = new OCSMSSharedPrefs(VirtualSettingsActivity._context); + // Must be at the end, after preference bind + super.onPostCreate(savedInstanceState); + } - // Handle sync frequency change - if ("sync_frequency".equals(key)) { - if (!PermissionChecker.checkPermission(this, Manifest.permission.GET_ACCOUNTS, - REQUEST_ACCOUNTS)) { - return; - } + protected void handleCheckboxPreference(String key, Boolean value) { + // Network types allowed for sync + if ("push_on_receive".equals(key) || + "sync_wifi".equals(key) || "sync_2g".equals(key) || + "sync_3g".equals(key) || "sync_gprs".equals(key) || + "sync_4g".equals(key) || "sync_others".equals(key)) { + OCSMSSharedPrefs prefs = new OCSMSSharedPrefs(VirtualSettingsActivity._context); + Log.i(OCSMSSettingsActivity.TAG, "OCSMSSettingsActivity.handleCheckboxPreference: set " + key + " to " + + value.toString()); + prefs.putBoolean(key, value); + } + } - Account[] myAccountList = OCSMSSettingsActivity._accountMgr.getAccountsByType(OCSMSSettingsActivity._accountType); - long syncFreq = Long.parseLong(value); + protected void handleListPreference(String key, String value, + ListPreference preference) { + // For list preferences, look up the correct display value in + // the preference's 'entries' list. + int index = preference.findIndexOfValue(value); + + // Set the summary to reflect the new value. + preference + .setSummary((index >= 0) ? preference.getEntries()[index] + : null); + + Log.i(OCSMSSettingsActivity.TAG, "Modifying listPreference " + key); + + OCSMSSharedPrefs prefs = new OCSMSSharedPrefs(VirtualSettingsActivity._context); + + // Handle sync frequency change + if ("sync_frequency".equals(key)) { + if (!PermissionChecker.checkPermission(this, Manifest.permission.GET_ACCOUNTS, + REQUEST_ACCOUNTS)) { + return; + } + + Account[] myAccountList = OCSMSSettingsActivity._accountMgr.getAccountsByType(OCSMSSettingsActivity._accountType); + long syncFreq = Long.parseLong(value); // Get ownCloud SMS account list - for (Account acct: myAccountList) { + for (Account acct : myAccountList) { // And get all authorities for this account List syncList = ContentResolver.getPeriodicSyncs(acct, OCSMSSettingsActivity._accountAuthority); boolean foundSameSyncCycle = false; - for (PeriodicSync ps: syncList) { + for (PeriodicSync ps : syncList) { if ((ps.period == syncFreq) && (ps.extras.getInt("synctype") == 1)) { foundSameSyncCycle = true; } @@ -123,16 +148,29 @@ public class OCSMSSettingsActivity extends VirtualSettingsActivity { b.putInt("synctype", 1); ContentResolver.removePeriodicSync(acct, OCSMSSettingsActivity._accountAuthority, b); - if (syncFreq > 0) { - ContentResolver.addPeriodicSync(acct, OCSMSSettingsActivity._accountAuthority, b, syncFreq * 60); - } + if (syncFreq > 0) { + ContentResolver.addPeriodicSync(acct, OCSMSSettingsActivity._accountAuthority, b, syncFreq * 60); + } } - prefs.putLong(key, syncFreq); + prefs.putLong(key, syncFreq); } + } else if ("sync_bulk_messages".equals(key) || "minimum_sync_chars".equals(key)) { + prefs.putInteger(key, Integer.parseInt(value)); } - else if ("sync_bulk_messages".equals(key) || "minimum_sync_chars".equals(key)) { - prefs.putInteger(key, Integer.parseInt(value)); - } + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + super.onMenuItemSelected(featureId, item); + + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + break; + default: + return false; + } + return true; } } diff --git a/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/AccountActionsActivity.java b/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/AccountActionsActivity.java index c5eae8c..cecd412 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/AccountActionsActivity.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/AccountActionsActivity.java @@ -2,7 +2,9 @@ package fr.unix_experience.owncloud_sms.activities.remote_account; import android.content.Intent; import android.os.Bundle; +import android.support.v7.app.ActionBar; import android.util.Log; +import android.view.MenuItem; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; @@ -19,6 +21,9 @@ public class AccountActionsActivity extends AppCompatListActivity { setContentView(R.layout.activity_account_actions); + ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayHomeAsUpEnabled(true); + ArrayList itemList = new ArrayList<>(); ArrayAdapter adp = new ArrayAdapter<>(getBaseContext(), android.R.layout.simple_dropdown_item_1line, itemList); @@ -33,20 +38,33 @@ public class AccountActionsActivity extends AppCompatListActivity { _accountName = getIntent().getStringExtra("account"); } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + boolean retval = true; + switch (item.getItemId()) { + case android.R.id.home: + finish(); + break; + default: + retval = super.onOptionsItemSelected(item); + } + return retval; + } + @Override protected void onListItemClick(ListView l, View v, int position, long id) { switch (position) { case 0: Intent intent = new Intent(this, RestoreMessagesActivity.class); intent.putExtra("account", _accountName); - try { - startActivity(intent); - } - catch (IllegalStateException e) { - Log.e(AccountActionsActivity.TAG, e.getMessage()); - } + try { + startActivity(intent); + } catch (IllegalStateException e) { + Log.e(AccountActionsActivity.TAG, e.getMessage()); + } break; - default: break; // Unhandled + default: + break; // Unhandled } } diff --git a/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/AccountListActivity.java b/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/AccountListActivity.java index f80f487..f2144d5 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/AccountListActivity.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/AccountListActivity.java @@ -3,13 +3,14 @@ package fr.unix_experience.owncloud_sms.activities.remote_account; import android.accounts.Account; import android.accounts.AccountManager; import android.os.Bundle; +import android.view.MenuItem; import java.util.ArrayList; import java.util.Collections; -import fr.unix_experience.owncloud_sms.adapters.AndroidAccountAdapter; import fr.unix_experience.android_lib.AppCompatListActivity; import fr.unix_experience.owncloud_sms.R; +import fr.unix_experience.owncloud_sms.adapters.AndroidAccountAdapter; public class AccountListActivity extends AppCompatListActivity { @@ -21,21 +22,35 @@ public class AccountListActivity extends AppCompatListActivity { setContentView(R.layout.restore_activity_accountlist); - ArrayList itemList = new ArrayList<>(); + getSupportActionBar().setHomeButtonEnabled(true); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); - AndroidAccountAdapter adapter = new AndroidAccountAdapter(this, + ArrayList itemList = new ArrayList<>(); + + AndroidAccountAdapter adapter = new AndroidAccountAdapter(this, android.R.layout.simple_list_item_1, - itemList, + itemList, R.layout.account_list_item, R.id.accountname, AccountActionsActivity.class); setListAdapter(adapter); Account[] accountList = _accountMgr.getAccountsByType(getString(R.string.account_type)); - Collections.addAll(itemList, accountList); + Collections.addAll(itemList, accountList); adapter.notifyDataSetChanged(); + } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + break; + default: + return super.onOptionsItemSelected(item); + } + return true; } } diff --git a/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/RestoreMessagesActivity.java b/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/RestoreMessagesActivity.java index 9d155c9..be14bb0 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/RestoreMessagesActivity.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/activities/remote_account/RestoreMessagesActivity.java @@ -26,8 +26,10 @@ import android.content.pm.PackageManager; import android.os.Bundle; import android.provider.Telephony; import android.support.v4.app.ActivityCompat; +import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.util.Log; +import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; @@ -49,6 +51,9 @@ public class RestoreMessagesActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_restore_messages); + ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayHomeAsUpEnabled(true); + assert getIntent().getExtras() != null; String accountName = getIntent().getExtras().getString("account"); @@ -111,6 +116,19 @@ public class RestoreMessagesActivity extends AppCompatActivity { }); } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + boolean retval = true; + switch (item.getItemId()) { + case android.R.id.home: + finish(); + break; + default: + retval = super.onOptionsItemSelected(item); + } + return retval; + } + private void initInterface() { TextView tv_error = (TextView) findViewById(R.id.tv_error_default_smsapp); tv_error.setText(R.string.error_make_default_sms_app); @@ -132,8 +150,7 @@ public class RestoreMessagesActivity extends AppCompatActivity { tv_error.setVisibility(View.VISIBLE); fix_button.setVisibility(View.VISIBLE); launch_restore.setVisibility(View.INVISIBLE); - } - else { + } else { tv_error.setVisibility(View.INVISIBLE); fix_button.setVisibility(View.INVISIBLE); launch_restore.setVisibility(View.VISIBLE); diff --git a/src/main/java/fr/unix_experience/owncloud_sms/notifications/OCSMSNotificationUI.java b/src/main/java/fr/unix_experience/owncloud_sms/notifications/OCSMSNotificationUI.java index bf92202..0df1878 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/notifications/OCSMSNotificationUI.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/notifications/OCSMSNotificationUI.java @@ -3,13 +3,10 @@ package fr.unix_experience.owncloud_sms.notifications; import android.annotation.TargetApi; import android.app.Notification; import android.app.NotificationManager; -import android.app.PendingIntent; import android.content.Context; -import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.net.Uri; import android.os.Build; import android.support.v4.app.NotificationCompat; @@ -40,7 +37,7 @@ public class OCSMSNotificationUI { // This image is used as the notification's large icon (thumbnail). // TODO: Remove this if your notification has no relevant thumbnail. - Bitmap picture = BitmapFactory.decodeResource(res, R.drawable.ic_launcher); + Bitmap picture = BitmapFactory.decodeResource(res, R.mipmap.ic_launcher); String ticker = (titleString.length() > 20) ? titleString.substring(0, 20) : titleString; @@ -50,31 +47,28 @@ public class OCSMSNotificationUI { // Set appropriate defaults for the notification light, sound, // and vibration. - .setSmallIcon(R.drawable.ic_launcher) + .setSmallIcon(R.drawable.notification_icon) .setContentTitle(title) .setContentText(contentString) - // All fields below this line are optional. + // All fields below this line are optional. - // Use a default priority (recognized on devices running Android - // 4.1 or later) + // Use a default priority (recognized on devices running Android + // 4.1 or later) .setPriority(NotificationCompat.PRIORITY_DEFAULT) - // Provide a large icon, shown with the notification in the - // notification drawer on devices running Android 3.0 or later. - .setLargeIcon(picture) - - // Set ticker text (preview) information for this notification. + // Set ticker text (preview) information for this notification. //.setTicker(ticker) - // Show a number. This is useful when stacking notifications of - // a single type. + // Show a number. This is useful when stacking notifications of + // a single type. .setNumber(number) .setStyle(new NotificationCompat.BigTextStyle() .bigText(contentString) .setBigContentTitle(title) .setSummaryText(titleString)) - .setAutoCancel(true); + .setAutoCancel(true) + .setColor(context.getResources().getColor(R.color.oc_primary)); OCSMSNotificationUI.notify(context, builder.build()); } @@ -83,25 +77,17 @@ public class OCSMSNotificationUI { private static void notify(Context context, Notification notification) { NotificationManager nm = (NotificationManager) context .getSystemService(Context.NOTIFICATION_SERVICE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) { - nm.notify(OCSMSNotificationUI.NOTIFICATION_TAG, 0, notification); - } else { - nm.notify(OCSMSNotificationUI.NOTIFICATION_TAG.hashCode(), notification); - } + nm.notify(OCSMSNotificationUI.NOTIFICATION_TAG, 0, notification); } /** * Cancels any notifications of this type previously shown using - * {@link #notify(Context, String, int)}. + * {@link #notify(Context, String, String, int)}. */ @TargetApi(Build.VERSION_CODES.ECLAIR) public static void cancel(Context context) { NotificationManager nm = (NotificationManager) context .getSystemService(Context.NOTIFICATION_SERVICE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) { - nm.cancel(OCSMSNotificationUI.NOTIFICATION_TAG, 0); - } else { - nm.cancel(OCSMSNotificationUI.NOTIFICATION_TAG.hashCode()); - } + nm.cancel(OCSMSNotificationUI.NOTIFICATION_TAG, 0); } } diff --git a/src/main/res/drawable-hdpi/logo.png b/src/main/res/drawable-hdpi/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..54d11bc8ca24181f9d41add26071e5422d396fb3 GIT binary patch literal 2049 zcmV+c2>$npP){K?%ZxfR++WK4Vtq1XXz1+I;Vf4$KLhlEF61Y8AN z103CHd1(k<0j>kCj)*<8e{fKE)aAe(z=tPSTN;Q5flo)ozYo0dYItV;O#J~kyFy`U z7@hzwiil@mCOqn5;C^6L#lq4s{24euB3_xAdEsg@IO)iI0QeR_sK*1(0!ylvl!oMG z;Pffr3uJIonI*twi-3zqe4|}7N3I=!qgItV7r^nrX}~cfyw4?zfVa2UaVM|^xD|LL zBKD0?M5ZJNqRYdFrHka&E8lFcAw@<_JaLLA{;d!NS`!pf%*QRLho;Z_cO@b3!zf;T06ZffW)ojriF!d<);+fC0`0_-X@O)RzKX>zpI;CFQ zb$ISn54#{#8ZI@|-<5=?^ayf8MC4te^U%!adPB)RrQvzHaQieYPnK+48lF7r%x^`X zZ+`Jjt(AsnlvNc{{}p|{rQs>-aZN*WLDANQr|R3(w{=u_sz^OWeWuG(^)rCG)pNQS zK&nH1KX5nA>i$JLwz)j9SN*BFPCccQ5v5Me9BJ06x2gMDWMJgGCl1(4vszdhhNX;t zQGDmP?*3c^=?OF!zsZh7jJQ}&we&8P9K43fj zK66>Ksd_{_23$q1zmwjaz?Bj4H<&fg6A?Gkd~wd@aMK$RxFRBMI`G0FXC3M#G*_F? zm|$V4-?jl8BI3^3FCH?(JhQ<{;5zc@eGA<*a4oR%^}&HT<~!7-z~wZ(zaIsT?V`fe zD?5REfnNbzBjT_NSRCu#DyNAIm&NC#e~c@)HU z;IWA4{}|Pi)t|Rm8>W`aYX8pqq!-il>Ux?l>BrZuWe$G@&dr6)8@*@-i-_BRb7__~ z>$7u!wY7`ri(Z5WAR_(=d>puveqUtWRJ(w_=*6F{*Hc#lKc+bv_0gJ$xUY5*we{x6 zGh0MFO0y>LX8Jkf{f*iM^g%C=JhQ1E0k#4wYS%K$ewvB1zt=9Lrd}R-W{Ze>fmQVD z2E8eoIiCfs_eY-D)JuVz80EQ`0GsXewd0qQdK`(qBzF7?#fV@ngF zUaCGn#sKBAbqk5QT)ksV;rXw6TLfI(45UDHFdqxb;GwNGvk0n*$czT7t zTzed;B1h{LdR!f3$7UK6N9z?@SG)ey1GeiGdZ2dQsV8jLD|BJ)x>JwX^a}mw2*dN6 z+V!TMv8-2URqc9H&v@j$LbueeHT9Hp_X_P*-&woP)KkvgEA+kEHKv~P@V!F+Q%|m4 zU+Osz-z#)Y?b^~ncxbQC3u>;WpN@=&_6p_NKIzDLaIerdvt1*V^0i)}dGVO>G-2vu f^|Q6>7{&hq5dg#>U4IMv00000NkvXXu0mjfTQ>4A literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-hdpi/notification_icon.png b/src/main/res/drawable-hdpi/notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..961401a97b8f71ae3ec5b84b0fe280679b1261ac GIT binary patch literal 586 zcmV-Q0=4~#P)dDNIxaVY(L%mvKJwAL`#7uD=f*0WJc&S$-u}zpsG0RSXot4yrHufIh2R+dyqlZ>ql%sO!Z+5$w1+R|CCQ zH@ArzQE%5!ms7K$J8BdI|j*~ Y-%IUVS=jEAm;e9(07*qoM6N<$g13SIEC2ui literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/logo.png b/src/main/res/drawable-mdpi/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..11e3a47b67229c08e762de03a58468f9ea31c26f GIT binary patch literal 1351 zcmV-N1-SZ&P)1K~#90?VVqU6;&L^KWEiY3l$Qwr1U{0%!<^=vO)@x9zr6@ zFf!;NNR6P3dg!62=&7h6@I}ywh#<&%D1-zbx~!s-T*5mZaXz7;sOi_ZB3yQmE_B`gh&| zH>mxjf5;MeAJ`5Y0e&q)d`X!_Qs+MitRcPI8EC}(ntT|@>ho)Iq&7bywfPaL&5uZJ zenc9XG&=>n0qg*JfZuXeRBmPf3xN&5eZZ8|))^nN{!~{NAi8p>Ycjm;&ockT*g=#T z^`$iPv-J?hNNA-{XQ+oKGT^H2Q&+?e zrc9_es-I=}+R&8p5JyM`kRS7vUTWr&Oer_A+M}LQjz~SF9FyAoh}7msq&7byjV=W| z1MDPOEc;7-a{i@*WYOswpt5CdBh}6!;DHdr!GbjX2lXys8_CLmDv?=g9tExsA@mj~ z>Ksg_wLhR*E9f#y&26!b2M8hT0`|t%(QLBJ|EUlajS>At&}_2IZ>4HzQfvXuCd=HG zs5I0m!1CBSnoS4kUx=?)pH`#21Jvmxn+)d1(vTB<;Q?k}dx=#j-J|Q-Lpm#j(}25naI2jo7#_3$xNZD8$Hg(=?Sh|~MIXtFcrS1;gfLjhQ`HUX?-}3TH*ypk5j~=9WWUu6|QM0-lQX#YahU(NIxn{V(qmGRKCJ#R#ss_&TYF_t7pwcnVE#$< z;@G+?gE~chRz2Nd0-lMjxpJ6nIPPh{{GZinvGrCCldbk!8%V&$*jg)#dbfHk#r$ur zkEG8J^%C{Hlmx7ct+CQLT#}v~#ry+mmG*YEChC>y7o#MgJ~yri)XAP(lJ1JFtF2I1 zsNEwHuq?KwwnClm@QHt^zh_dD6Y3o%s~qa}oiR}7sCUNH@DKj){%%>JcESJv002ov JPDHLkV1ilrhLZpQ literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/notification_icon.png b/src/main/res/drawable-mdpi/notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..28944f9c4bf36e0a65059863660398b74370e43c GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEX7WqAsj$Z!;#Vf2?- zWgyIWxAwmUkRe&(8c`CQpH@mmtT}V`<;yx0|TSAr;B5V zN9Wrqj@mAP5^eL1i#1&%wM>=G{xw7{65-yqX|C?ZbX{)iQ}<5wZvcV`YbU93yZ&TP zGc@i$dgt`pu7|rOPulMHe9rqTziaN7`?3G~dYg+Oi}MCsTH_~v+uH{$H^@7^a4Fot z_lEKN0nr4%&kSc6yblN$%wf>_xJSro$GJ?t1}ok>451Ag#dQnjG0vUyPc=bN_5{~H>3)XnR|a>dPjF97umq~v_9$?M*UZ0G0JYD@<);T3K0RTRjwC4Z- literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/logo.png b/src/main/res/drawable-xhdpi/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a779cf07dd799e354ae6e7a051b2c15ae3dbef09 GIT binary patch literal 2839 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 Qw}}M-77obT3#jY=1;8O)8~^|S literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/notification_icon.png b/src/main/res/drawable-xhdpi/notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..41cfc4304bec823e30e2ae3e7ebcb842444ef2c4 GIT binary patch literal 701 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 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxhdpi/notification_icon.png b/src/main/res/drawable-xxhdpi/notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c4543ad0eee52697e212bff0724b5e89813c6da7 GIT binary patch literal 1071 zcmV+~1kn45P)-BOVxT; zA&T^%Rm6+!Nu(F)LB&fgC@9ja=%LVqCoMuK6`=~nlWA$IBB?^55E_Y^^y^_)37eP9 z+uhln+0FYLCvV^W-jB@e?Aw7X%d#xXvMkH8Y|ui{0Cf!54r~Fg>wBWXSOk6trb7tV zRvWltLFx^_LEt6e=2GL;$7SFs@JF86Wa3x|yQNo1Xe+Q-HIgJQlfIbR)|P8pP1(1sp@)K$`&QVZIr-q=H!T2XHT zUP&3-NSt#Aa9%wITm%*h#@AJY=DpoBz~HHA%tn*!<4b91zqVrPHiQv zDYc+`dI(Zi+foLlUV{#(Gr-Xh!qx6GRZrar>;v|vj883S9q<8gSiJIvW!@JLDXmM--a`@F<*{ue@+2fiqK-ZG^Y6#E6BEd89jXR(4}-_-Z2 zrSD6tn}8R~p0@|f)*ibCor@fs0De+Gqq*I&*kh0ea2N0b%^SD6m~KB1`{{WjaF%)n zAA}iTTL@up>A_{ESnIpi^T1sD-$vLRFxg%XtZ14I zyVP?fl=OPlYv~*HdgD(|bmD@|hq*?V`m{RJLrIfWuc7bMTh!xS7Ia2U-u)YD>RxrW zi<0(Koqb@`JJqQU3;L$&+ykYKsc)!%bx_iyRp%Z!^?sYzm=wpV&RYp}TzyYnEGTGE zy|3!Ll~H%AzZR7AY1KI^rEYTdo6C81P5mYpr9P`(UZJG-tIk&o>K66ONI|n|(!-Y{ zPYvp;>eaTA-l{rVt*G~^rff!BUaLA&EvY-zY4yCLz7^6fb-j8- peXi;(wWi)tb%rd002ovPDHLkV1hmZ{0;yB literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/logo.png b/src/main/res/drawable-xxxhdpi/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e08efca0e58b0ea0379493213540b1b782365110 GIT binary patch literal 6197 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�c7p53CjhvJgnx)>3+rhBR_uoTKtjwl?2+|8G8X9YyNoz ztKT3K+E|OVDhj-E%eTG~o5)}>O3SK|Z4-B4?F;Ct20VZmC-|MR+j{C;w=Sr59Z1|$ z7qYcYOs}uRX172m5ge}kWx=A{v>2eK!0Op!w|-R;CpH|y7Ii!0(qeri+vpxx=ELJo zunMW}iup$|pMM!HkOeowQ0gQ)LaHOv4uhkMdAw641n4K&t{H!$hFO- zcfp2I{{+Em`D2_VO%t1uf(t(b6Byx0RAYGd_p#$#ld6Sv3#&id+ji Kvh;-4PyYosjVl@e literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/notification_icon.png b/src/main/res/drawable-xxxhdpi/notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..384f0dfba43da77606b6709e355c0b99f5565af4 GIT binary patch literal 1367 zcmV-d1*rOoP)|@b6fLtXGKx&i>(y_IxuNMfbLPyM zbDw)=p3nB2XXZciyLX;vo;lAzk|arzBuSDaNs=TrvKwSc?1Fr40!iL!fJRCyU zmG`CG0MzBc2r#q4!kXkS;EoW&)^=ZL8-O|&_y(BQhr*iV5HK7<__fuCQ*s(UO*;8i zm;*e~?!&zQfW5%wIU5$(4eSLSO8xyXoC) z#%#2>KwYE$)Zv`944~!Mb^OakJKE#G(UQk7=q?0?3VwHb2;rPQqKfI{p)QI@&eGV+ z$7GQLh%5yVSucISL0}`WkE|nZq9L*g%UgjUhVQ%>%tqW*FLTgLwgL z=;N^rG6yas#=9IK|BbIbsSfk%NG`?QbAr^9`K>XQ*_dagrFlU-%^0h>bzw^Vgv zi!xgz@;PwbMDM#Il?_98R8UOU##ftckFoE58nnr{+D!zO31I2?j(6Gq0Uv`nSi;L2Vx)Vq^91Z{?W$(cG=*? zB88|6)ld2u!m8NEIO(ZDeO&#g4*_h8eS8B$9ag{ULkM{{kI9+T^VJvClNAQ=UhLx< zIO;NWPelQoQio$7)4)+@sjpTP!t1e*XJDzT)!%vyVAQmjygYTjx}nDqUXFbn1I=u> z`iOeCWB^ChIkAsp;Hit%ttCTvCU*U`piWhvQjd2Tz#+AoH<%=#E>*wlGK4j;>#h~` z0=v6;+iy2ZM3Z97mINIr7{dLr>#Zeqw)#ea0CpPTw@i&;_N?Le4k6qgyUtoOdvn!C zIRShcyT;n{^v&CmHX$sFU1KAdy~%b*ivZTguB|c57MVQj|6jp;O1(OEZH=N{ukJo0 zgmtlNY8-W@r=K;9staP*)JW=W>d)#+v1@58b)NdBdU5Pp8qEn@V3H(Bk|arzBuR3n Ze*q_pM04jO40iwk002ovPDHLkV1heDhFAaq literal 0 HcmV?d00001 diff --git a/src/main/res/layout/activity_login.xml b/src/main/res/layout/activity_login.xml index 52e5256..1bce17b 100644 --- a/src/main/res/layout/activity_login.xml +++ b/src/main/res/layout/activity_login.xml @@ -61,7 +61,9 @@ android:id="@+id/ocsms_logo" android:layout_width="match_parent" android:layout_height="wrap_content" - android:src="@drawable/login_logo" + android:paddingTop="24dp" + android:paddingBottom="36dp" + android:src="@drawable/logo" android:contentDescription="@string/login_logo" /> - + android:layout_gravity="center_vertical" + android:popupBackground="@color/oc_primary" + android:entries="@array/protocol_array" /> @@ -99,9 +103,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/prompt_login" + android:textColor="@color/oc_white" android:inputType="textEmailAddress" - android:maxLines="1" - android:singleLine="true" /> + android:maxLines="1" /> + android:textColor="@color/oc_white" /> - + android:layout_height="match_parent" + android:orientation="vertical"> + + - - - + + android:fitsSystemWindows="true"/> \ No newline at end of file diff --git a/src/main/res/layout/nav_header_main.xml b/src/main/res/layout/nav_header_main.xml index 0a767b2..4a054cd 100644 --- a/src/main/res/layout/nav_header_main.xml +++ b/src/main/res/layout/nav_header_main.xml @@ -3,24 +3,21 @@ android:layout_width="match_parent" android:layout_height="@dimen/nav_header_height" android:background="@drawable/side_nav_bar" - android:gravity="top" + android:gravity="bottom" android:orientation="vertical" - android:paddingBottom="@dimen/activity_vertical_margin" - android:paddingLeft="@dimen/activity_horizontal_margin" - android:paddingRight="@dimen/activity_horizontal_margin" + android:padding="@dimen/activity_horizontal_margin" android:theme="@style/ThemeOverlay.AppCompat.Dark"> diff --git a/src/main/res/layout/recovery_phone_list_item.xml b/src/main/res/layout/recovery_phone_list_item.xml index f1de1b2..79701d5 100644 --- a/src/main/res/layout/recovery_phone_list_item.xml +++ b/src/main/res/layout/recovery_phone_list_item.xml @@ -6,6 +6,6 @@ android:id="@+id/recovery_phone" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:padding="20dp" - android:textSize="18sp" /> + android:padding="@dimen/activity_vertical_margin" + android:textSize="18sp"/> \ No newline at end of file diff --git a/src/main/res/values-v14/styles.xml b/src/main/res/layout/toolbar.xml similarity index 56% rename from src/main/res/values-v14/styles.xml rename to src/main/res/layout/toolbar.xml index e871bf8..48cc823 100644 --- a/src/main/res/values-v14/styles.xml +++ b/src/main/res/layout/toolbar.xml @@ -1,5 +1,7 @@ + + - + - - + + + \ No newline at end of file diff --git a/src/main/res/drawable-hdpi/ic_launcher.png b/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from src/main/res/drawable-hdpi/ic_launcher.png rename to src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/src/main/res/drawable-mdpi/ic_launcher.png b/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from src/main/res/drawable-mdpi/ic_launcher.png rename to src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/src/main/res/drawable-xhdpi/ic_launcher.png b/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from src/main/res/drawable-xhdpi/ic_launcher.png rename to src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/src/main/res/drawable-xxhdpi/ic_launcher.png b/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from src/main/res/drawable-xxhdpi/ic_launcher.png rename to src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..0a4e4fb36b14535edcdc5a440dad7a429bfa6092 GIT binary patch literal 4224 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 literal 0 HcmV?d00001 diff --git a/src/main/res/values-en/strings.xml b/src/main/res/values-en/strings.xml index f96af1e..f9aebf6 100644 --- a/src/main/res/values-en/strings.xml +++ b/src/main/res/values-en/strings.xml @@ -97,7 +97,7 @@ Rate us ! Add an account Welcome - Welcome to ownCloud SMS application. This application let you synchronize your SMS to your ownCloud instance using SMS app. + Welcome to Nextcloud SMS application. This application let you synchronize your SMS to your Nextcloud instance using SMS app. Sync process diff --git a/src/main/res/values-v21/styles.xml b/src/main/res/values-v21/styles.xml index 3546a86..af914c8 100644 --- a/src/main/res/values-v21/styles.xml +++ b/src/main/res/values-v21/styles.xml @@ -1,23 +1,23 @@ - - - - > - + + \ No newline at end of file diff --git a/src/main/res/values-w820dp/dimens.xml b/src/main/res/values-w820dp/dimens.xml index f3e7020..53d321b 100644 --- a/src/main/res/values-w820dp/dimens.xml +++ b/src/main/res/values-w820dp/dimens.xml @@ -6,5 +6,5 @@ would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> 64dp - + 164dp diff --git a/src/main/res/values/colors.xml b/src/main/res/values/colors.xml index 864aaee..0188656 100644 --- a/src/main/res/values/colors.xml +++ b/src/main/res/values/colors.xml @@ -2,4 +2,7 @@ #0082C9 #006AA3 + #007CC2 + #7fC0E3 + #ffffff \ No newline at end of file diff --git a/src/main/res/values/dimens.xml b/src/main/res/values/dimens.xml index 4511974..5e2ea1f 100644 --- a/src/main/res/values/dimens.xml +++ b/src/main/res/values/dimens.xml @@ -6,7 +6,8 @@ 22dp 16dp - 120dp + 8dp + 140dp 16dp diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml index cec2cde..0c459f2 100644 --- a/src/main/res/values/styles.xml +++ b/src/main/res/values/styles.xml @@ -27,15 +27,39 @@ - - - + + + + + + + + -