1
0
Fork 0
mirror of https://github.com/gsantner/dandelion synced 2024-11-25 13:52:08 +01:00

Merge pull request #79 from Diaspora-for-Android/poddy_as_podsource

Use Poddy as podsource
This commit is contained in:
Gregor Santner 2016-10-14 01:37:28 +02:00 committed by GitHub
commit 72189af353
80 changed files with 2976 additions and 570 deletions

View file

@ -6,7 +6,7 @@ android:
- tools
- tools # TODO https://github.com/travis-ci/travis-ci/issues/6193
- platform-tools
- build-tools-24.0.2
- build-tools-24.0.3
- android-24
- extra-android-m2repository
before_cache:

View file

@ -3,7 +3,7 @@ apply plugin: 'android-apt'
android {
compileSdkVersion 24
buildToolsVersion "24.0.2"
buildToolsVersion "24.0.3"
defaultConfig {
applicationId "com.github.dfa.diaspora_android"

View file

@ -66,7 +66,15 @@
<category android:name="android.intent.category.BROWSABLE" />
<!--@@@ PODLIST START-->
<data android:host="joindiaspora.com" android:scheme="https" />
<data android:host="diasporaaqmjixh5.onion" android:scheme="http" />
<data android:host="pod.geraspora.de" android:scheme="https" />
<data android:host="diasp.org" android:scheme="https" />
<data android:host="framasphere.org" android:scheme="https" />
<data android:host="nerdpol.ch" android:scheme="https" />
<data android:host="despora.de" android:scheme="https" />
<data android:host="sechat.org" android:scheme="https" />
<data android:host="sechatqpscuj2npx.onion" android:scheme="http" />
<data android:host="austriapod.at" android:scheme="https" />
<data android:host="berdaguermontes.eu" android:scheme="https" />
<data android:host="berlinspora.de" android:scheme="https" />
@ -74,7 +82,6 @@
<data android:host="community.kanalinseln.de" android:scheme="https" />
<data android:host="cryptospora.net" android:scheme="https" />
<data android:host="d.consumium.org" android:scheme="https" />
<data android:host="despora.de" android:scheme="https" />
<data android:host="dia.manuelbichler.at" android:scheme="https" />
<data android:host="dia.myocastor.de" android:scheme="https" />
<data android:host="diapod.net" android:scheme="https" />
@ -86,17 +93,16 @@
<data android:host="diasp.eu.com" android:scheme="https" />
<data android:host="diasp.nl" android:scheme="https" />
<data android:host="diaspod.de" android:scheme="https" />
<data android:host="diaspora-fr.org" android:scheme="https" />
<data android:host="diaspora.alfter.us" android:scheme="https" />
<data android:host="diaspora.bohramt.de" android:scheme="https" />
<data android:host="diasporabrazil.org" android:scheme="https" />
<data android:host="diasporabr.com.br" android:scheme="https" />
<data android:host="diaspora.com.ar" android:scheme="https" />
<data android:host="diaspora.deadhexagon.com" android:scheme="https" />
<data android:host="diaspora.digi-merc.org" android:scheme="https" />
<data android:host="diaspora.digitalismus.org" android:scheme="https" />
<data android:host="diaspora.dorf-post.de" android:scheme="https" />
<data android:host="diaspora.espiritolivre.org" android:scheme="https" />
<data android:host="diaspora.fr33.co" android:scheme="https" />
<data android:host="diaspora-fr.org" android:scheme="https" />
<data android:host="diaspora.horwood.biz" android:scheme="https" />
<data android:host="diaspora.hzsogood.net" android:scheme="https" />
<data android:host="diaspora.kapper.net" android:scheme="https" />
@ -104,15 +110,14 @@
<data android:host="diaspora.kosebamse.com" android:scheme="https" />
<data android:host="diaspora.lebarjack.com" android:scheme="https" />
<data android:host="diaspora.mazi.tk" android:scheme="https" />
<data android:host="diaspora.microdata.co.uk" android:scheme="https" />
<data android:host="diaspora.moosje.nl" android:scheme="https" />
<data android:host="diaspora.net.gr" android:scheme="https" />
<data android:host="diasporanet.tk" android:scheme="https" />
<data android:host="diaspora.permutationsofchaos.com" android:scheme="https" />
<data android:host="diaspora.pimpmypony.eu" android:scheme="https" />
<data android:host="diaspora.pingupod.de" android:scheme="https" />
<data android:host="diaspora.podzimek.org" android:scheme="https" />
<data android:host="diaspora.poleni.com" android:scheme="https" />
<data android:host="diasporapr.tk" android:scheme="https" />
<data android:host="diaspora.psyco.fr" android:scheme="https" />
<data android:host="diaspora.punkbeer.me" android:scheme="https" />
<data android:host="diaspora.raven-ip.com" android:scheme="https" />
@ -126,10 +131,14 @@
<data android:host="diaspora.u4u.org" android:scheme="https" />
<data android:host="diaspora.undernet.uy" android:scheme="https" />
<data android:host="diaspora.unixcorn.org" android:scheme="https" />
<data android:host="diasporausa.com" android:scheme="https" />
<data android:host="diaspora.weenmebrown.com" android:scheme="https" />
<data android:host="diaspora.xcelor8.com" android:scheme="https" />
<data android:host="diasp.org" android:scheme="https" />
<data android:host="diasporabr.com.br" android:scheme="https" />
<data android:host="diasporabrazil.org" android:scheme="https" />
<data android:host="diasporanet.tk" android:scheme="https" />
<data android:host="diasporapr.tk" android:scheme="https" />
<data android:host="diasporausa.com" android:scheme="https" />
<data android:host="diasporing.ch" android:scheme="https" />
<data android:host="dissociateduse.rs" android:scheme="https" />
<data android:host="distributed.chat" android:scheme="https" />
<data android:host="eat.egregious.ly" android:scheme="https" />
@ -138,50 +147,43 @@
<data android:host="espora.social" android:scheme="https" />
<data android:host="failure.net" android:scheme="https" />
<data android:host="flokk.no" android:scheme="https" />
<data android:host="framasphere.org" android:scheme="https" />
<data android:host="freehuman.fr" android:scheme="https" />
<data android:host="friendica.tk" android:scheme="https" />
<data android:host="home.enslaver.net" android:scheme="https" />
<data android:host="idoru.pl" android:scheme="https" />
<data android:host="iliketoast.net" android:scheme="https" />
<data android:host="joindiaspora.com" android:scheme="https" />
<data android:host="jons.gr" android:scheme="https" />
<data android:host="kapok.se" android:scheme="https" />
<data android:host="karmasphe.re" android:scheme="https" />
<data android:host="kosmospora.net" android:scheme="https" />
<data android:host="laba.mba" android:scheme="https" />
<data android:host="legends.im" android:scheme="https" />
<data android:host="liberdade.digital" android:scheme="https" />
<data android:host="libertypod.org" android:scheme="https" />
<data android:host="LibertyPod.org" android:scheme="https" />
<data android:host="librenet.co.za" android:scheme="https" />
<data android:host="librenet.gr" android:scheme="https" />
<data android:host="londor.be" android:scheme="https" />
<data android:host="lubiora.de" android:scheme="https" />
<data android:host="misamigos.online" android:scheme="https" />
<data android:host="mondiaspora.net" android:scheme="https" />
<data android:host="nerdpol.ch" android:scheme="https" />
<data android:host="networkwizard.de" android:scheme="https" />
<data android:host="nx-pod.de" android:scheme="https" />
<data android:host="parteidervernunft.com" android:scheme="https" />
<data android:host="pe.spbstu.ru" android:scheme="https" />
<data android:host="pod.4ray.co" android:scheme="https" />
<data android:host="pod.8n1.org" android:scheme="https" />
<data android:host="pod.alterworld.info" android:scheme="https" />
<data android:host="pod.asap-soft.com" android:scheme="https" />
<data android:host="podbay.net" android:scheme="https" />
<data android:host="pod.cannyfoxx.me" android:scheme="https" />
<data android:host="pod.comin.dk" android:scheme="https" />
<data android:host="pod.cyberdungeon.de" android:scheme="https" />
<data android:host="pod.dapor.net" android:scheme="https" />
<data android:host="pod.datenknoten.me" android:scheme="https" />
<data android:host="poddery.com" android:scheme="https" />
<data android:host="pod.diaspora.software" android:scheme="https" />
<data android:host="pod.dirkomatik.de" android:scheme="https" />
<data android:host="pod.disroot.org" android:scheme="https" />
<data android:host="pod.dobs.at" android:scheme="https" />
<data android:host="pod.dragondreaming.de" android:scheme="https" />
<data android:host="pod.gaialabs.ch" android:scheme="https" />
<data android:host="pod.gedankenausbruch.com" android:scheme="https" />
<data android:host="pod.geraspora.de" android:scheme="https" />
<data android:host="pod.gleisnetze.de" android:scheme="https" />
<data android:host="pod.goodsharing.at" android:scheme="https" />
<data android:host="pod.hashtagueule.fr" android:scheme="https" />
@ -200,32 +202,33 @@
<data android:host="pod.psynet.su" android:scheme="https" />
<data android:host="pod.readme.is" android:scheme="https" />
<data android:host="pod.richtig.koeln" android:scheme="https" />
<data android:host="podricing.pw" android:scheme="https" />
<data android:host="pod.roocita.com" android:scheme="https" />
<data android:host="pod.ros-it.ch" android:scheme="https" />
<data android:host="pod.sccn.club" android:scheme="https" />
<data android:host="pod.sertelon.fr" android:scheme="https" />
<data android:host="pod.shouldit.work" android:scheme="https" />
<data android:host="pod.skisso.com" android:scheme="https" />
<data android:host="pod.storel.li" android:scheme="https" />
<data android:host="pod.tchncs.de" android:scheme="https" />
<data android:host="pod.thomasdalichow.de" android:scheme="https" />
<data android:host="pod.undreaming.org" android:scheme="https" />
<data android:host="pod.volt.io" android:scheme="https" />
<data android:host="podbay.net" android:scheme="https" />
<data android:host="poddery.com" android:scheme="https" />
<data android:host="podricing.pw" android:scheme="https" />
<data android:host="pubpod.alqualonde.org" android:scheme="https" />
<data android:host="realms.the-wizard.co.za" android:scheme="https" />
<data android:host="revreso.de" android:scheme="https" />
<data android:host="ruhrspora.de" android:scheme="https" />
<data android:host="russiandiaspora.org" android:scheme="https" />
<data android:host="sechat.org" android:scheme="https" />
<data android:host="shrekislove.us" android:scheme="https" />
<data android:host="social.acclaro.digital" android:scheme="https" />
<data android:host="social.baldr.io" android:scheme="https" />
<data android:host="social.daxbau.net" android:scheme="https" />
<data android:host="social.elaon.de" android:scheme="https" />
<data android:host="socializer.cc" android:scheme="https" />
<data android:host="social.lanham.id.au" android:scheme="https" />
<data android:host="social.mbuto.me" android:scheme="https" />
<data android:host="social.sum7.de" android:scheme="https" />
<data android:host="spora.com.ua" android:scheme="https" />
<data android:host="socializer.cc" android:scheme="https" />
<data android:host="spora.zone" android:scheme="https" />
<data android:host="subvillage.de" android:scheme="https" />
<data android:host="sysad.org" android:scheme="https" />
@ -238,7 +241,10 @@
<data android:host="wk3.org" android:scheme="https" />
<data android:host="www.datataffel.dk" android:scheme="https" />
<data android:host="www.diasporaix.de" android:scheme="https" />
<data android:host="diaspora.hofud.com" android:scheme="https" />
<data android:host="diaspora.softwarelivre.org" android:scheme="https" />
<data android:host="confetticake.club" android:scheme="https" />
<data android:host="diaspora.mike-jones.me.uk" android:scheme="https" />
<!--@@@ PODLIST END-->
</intent-filter>

View file

@ -310,6 +310,7 @@ implements IntellihideToolbarActivityListener {
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.about__fragment_debug, container, false);
ButterKnife.bind(this, rootView);
App app = (App) getActivity().getApplication();
logBox.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
@ -338,6 +339,9 @@ implements IntellihideToolbarActivityListener {
osVersion.setText(getString(R.string.fragment_debug__android_version, Build.VERSION.RELEASE));
deviceName.setText(getString(R.string.fragment_debug__device_name, Build.MANUFACTURER + " " + Build.MODEL));
podDomain.setText(getString(R.string.fragment_debug__pod_domain, urls.getPodUrl()));
if (app.getSettings().getPod() != null) {
podDomain.setText(getString(R.string.fragment_debug__pod_domain, app.getSettings().getPod().getName()));
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();

View file

@ -68,15 +68,15 @@ import com.github.dfa.diaspora_android.fragment.HashtagListFragment;
import com.github.dfa.diaspora_android.fragment.PodSelectionFragment;
import com.github.dfa.diaspora_android.listener.WebUserProfileChangedListener;
import com.github.dfa.diaspora_android.receiver.OpenExternalLinkReceiver;
import com.github.dfa.diaspora_android.util.ProxyHandler;
import com.github.dfa.diaspora_android.receiver.UpdateTitleReceiver;
import com.github.dfa.diaspora_android.ui.BadgeDrawable;
import com.github.dfa.diaspora_android.ui.IntellihideToolbarActivityListener;
import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.CustomTabHelpers.CustomTabActivityHelper;
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import com.github.dfa.diaspora_android.util.theming.ThemeHelper;
import com.github.dfa.diaspora_android.util.ProxyHandler;
import com.github.dfa.diaspora_android.util.WebHelper;
import com.github.dfa.diaspora_android.util.theming.ThemeHelper;
import butterknife.BindView;
import butterknife.ButterKnife;
@ -195,8 +195,9 @@ public class MainActivity extends ThemedActivity
}
});
if (!appSettings.hasPodDomain()) {
if (!appSettings.hasPod()) {
AppLog.d(this, "We have no pod. Show PodSelectionFragment");
updateNavigationViewEntryVisibilities();
showFragment(getFragment(PodSelectionFragment.TAG));
} else {
AppLog.d(this, "Pod found. Handle intents.");
@ -246,6 +247,7 @@ public class MainActivity extends ThemedActivity
/**
* Show DiasporaStreamFragment if necessary and load URL url
*
* @param url URL to load in the DiasporaStreamFragment
*/
public void openDiasporaUrl(String url) {
@ -259,6 +261,7 @@ public class MainActivity extends ThemedActivity
* Get an instance of the CustomFragment with the tag fragmentTag.
* If there was no instance so far, create a new one and add it to the FragmentManagers pool.
* If there is no Fragment with the corresponding Tag, return the top fragment.
*
* @param fragmentTag tag
* @return corresponding Fragment
*/
@ -294,6 +297,7 @@ public class MainActivity extends ThemedActivity
/**
* Show the Fragment fragment in R.id.fragment_container. If the fragment was already visible, do nothing.
*
* @param fragment Fragment to show
*/
protected void showFragment(CustomFragment fragment) {
@ -342,8 +346,8 @@ public class MainActivity extends ThemedActivity
if (!appSettings.getName().equals("")) {
navheaderTitle.setText(appSettings.getName());
}
if (!appSettings.getPodDomain().equals("")) {
navheaderDescription.setText(appSettings.getPodDomain());
if (appSettings.getPod() != null) {
navheaderDescription.setText(appSettings.getPod().getName());
}
String avatarUrl = appSettings.getAvatarUrl();
if (!avatarUrl.equals("")) {
@ -376,10 +380,16 @@ public class MainActivity extends ThemedActivity
navMenu.findItem(R.id.nav_mentions).setVisible(appSettings.isVisibleInNavMentions());
navMenu.findItem(R.id.nav_profile).setVisible(appSettings.isVisibleInNavProfile());
navMenu.findItem(R.id.nav_public).setVisible(appSettings.isVisibleInNavPublic_activities());
// Top bar
if (!appSettings.hasPod()) {
navMenu.setGroupVisible(navMenu.findItem(R.id.nav_exit).getGroupId(), false);
}
}
/**
* Forward incoming intents to handleIntent()
*
* @param intent incoming
*/
@Override
@ -390,6 +400,7 @@ public class MainActivity extends ThemedActivity
/**
* Handle intents and execute intent specific actions
*
* @param intent intent to get handled
*/
private void handleIntent(Intent intent) {
@ -418,6 +429,7 @@ public class MainActivity extends ThemedActivity
}
} else if (ACTION_CHANGE_ACCOUNT.equals(action)) {
AppLog.v(this, "Reset pod data and show PodSelectionFragment");
appSettings.setPod(null);
app.resetPodData(((DiasporaStreamFragment) getFragment(DiasporaStreamFragment.TAG)).getWebView());
showFragment(getFragment(PodSelectionFragment.TAG));
} else if (ACTION_CLEAR_CACHE.equals(action)) {
@ -462,6 +474,7 @@ public class MainActivity extends ThemedActivity
/**
* Return the fragment which is currently displayed in R.id.fragment_container
*
* @return top fragment or null if there is none displayed
*/
private CustomFragment getTopFragment() {
@ -545,6 +558,7 @@ public class MainActivity extends ThemedActivity
/**
* Clear and repopulate top and bottom toolbar.
* Also add menu items of the displayed fragment
*
* @param menu top toolbar
* @return boolean
*/
@ -575,12 +589,14 @@ public class MainActivity extends ThemedActivity
/**
* Set the notification and messages counter in the top toolbar
*
* @param menu menu
* @return boolean
*/
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem item;
updateNavigationViewEntryVisibilities();
if ((item = menu.findItem(R.id.action_notifications)) != null) {
LayerDrawable icon = (LayerDrawable) item.getIcon();
@ -596,6 +612,7 @@ public class MainActivity extends ThemedActivity
/**
* Handle clicks on the optionsmenu
*
* @param item item
* @return boolean
*/
@ -694,6 +711,7 @@ public class MainActivity extends ThemedActivity
/**
* Update the profile name in the navigation slider
*
* @param name name
*/
@Override
@ -704,6 +722,7 @@ public class MainActivity extends ThemedActivity
/**
* Update the profile picture in the navigation slider
*
* @param avatarUrl url of the new profile pic
*/
@Override
@ -714,6 +733,7 @@ public class MainActivity extends ThemedActivity
/**
* Handle hashtag clicks. Open the new-post-url and inject the clicked hashtag into the post-editor
*
* @param intent intent
*/
private void handleHashtag(Intent intent) {
@ -728,6 +748,7 @@ public class MainActivity extends ThemedActivity
/**
* Open the new-post-url and inject text that was shared into the app into the post editors text field
*
* @param intent shareTextIntent
*/
private void handleSendText(Intent intent) {
@ -786,6 +807,7 @@ public class MainActivity extends ThemedActivity
/**
* Share an image shared to the app via diaspora
*
* @param intent shareImageIntent
*/
//TODO: Implement some day
@ -802,6 +824,7 @@ public class MainActivity extends ThemedActivity
/**
* Invalidate the top toolbar to update the notification counter
*
* @param notificationCount new notification count
*/
@Override
@ -813,6 +836,7 @@ public class MainActivity extends ThemedActivity
/**
* Invalidate the top toolbar to update the unread messages counter
*
* @param unreadMessageCount new unread messages count
*/
@Override
@ -945,6 +969,7 @@ public class MainActivity extends ThemedActivity
/**
* React to results of requestPermission
*
* @param requestCode resCode
* @param permissions requested permissions
* @param grantResults granted results
@ -970,6 +995,7 @@ public class MainActivity extends ThemedActivity
/**
* Return the string that will be shared into the new-post-editor
*
* @return String
*/
public String getTextToBeShared() {
@ -978,6 +1004,7 @@ public class MainActivity extends ThemedActivity
/**
* Set the string that will be shared into the new-post-editor
*
* @param textToBeShared
*/
public void setTextToBeShared(String textToBeShared) {

View file

@ -41,9 +41,10 @@ import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.data.AppSettings;
import com.github.dfa.diaspora_android.ui.IntellihideToolbarActivityListener;
import com.github.dfa.diaspora_android.util.theming.ColorPalette;
import com.github.dfa.diaspora_android.util.ProxyHandler;
import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import com.github.dfa.diaspora_android.util.ProxyHandler;
import com.github.dfa.diaspora_android.util.theming.ColorPalette;
import com.github.dfa.diaspora_android.util.theming.ThemeHelper;
import butterknife.BindView;
@ -63,6 +64,7 @@ public class SettingsActivity extends ThemedActivity implements IntellihideToolb
private ProxyHandler.ProxySettings oldProxySettings;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -178,7 +180,7 @@ public class SettingsActivity extends ThemedActivity implements IntellihideToolb
}
Intent intent = new Intent(getActivity(), MainActivity.class);
String podDomain = appSettings.getPodDomain();
DiasporaUrlHelper diasporaUrlHelper = new DiasporaUrlHelper(app.getSettings());
switch (preference.getTitleRes()) {
case R.string.pref_title__primary_color: {
@ -193,17 +195,17 @@ public class SettingsActivity extends ThemedActivity implements IntellihideToolb
}
case R.string.pref_title__personal_settings: {
intent.setAction(MainActivity.ACTION_OPEN_URL);
intent.putExtra(MainActivity.URL_MESSAGE, "https://" + podDomain + "/user/edit");
intent.putExtra(MainActivity.URL_MESSAGE, diasporaUrlHelper.getPersonalSettingsUrl());
break;
}
case R.string.pref_title__manage_tags: {
intent.setAction(MainActivity.ACTION_OPEN_URL);
intent.putExtra(MainActivity.URL_MESSAGE, "https://" + podDomain + "/tag_followings/manage");
intent.putExtra(MainActivity.URL_MESSAGE, diasporaUrlHelper.getManageTagsUrl());
break;
}
case R.string.pref_title__manage_contacts: {
intent.setAction(MainActivity.ACTION_OPEN_URL);
intent.putExtra(MainActivity.URL_MESSAGE, "https://" + podDomain + "/contacts");
intent.putExtra(MainActivity.URL_MESSAGE, diasporaUrlHelper.getManageContactsUrl());
break;
}
case R.string.pref_title__change_account: {
@ -229,8 +231,7 @@ public class SettingsActivity extends ThemedActivity implements IntellihideToolb
return true;
}
case R.string.pref_title__clear_cache:
{
case R.string.pref_title__clear_cache: {
intent.setAction(MainActivity.ACTION_CLEAR_CACHE);
break;
}
@ -250,6 +251,7 @@ public class SettingsActivity extends ThemedActivity implements IntellihideToolb
/**
* Show a colorPicker Dialog
*
* @param type 1 -> Primary Color, 2 -> Accent Color
*/
public void showColorPickerDialog(final int type) {

View file

@ -48,6 +48,7 @@ public abstract class ThemedActivity extends AppCompatActivity {
updateRecentAppColor();
applyColorToViews();
}
protected abstract void applyColorToViews();
/**

View file

@ -19,8 +19,13 @@ import android.content.Context;
import android.content.SharedPreferences;
import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod;
import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod.DiasporaPodUrl;
import com.github.dfa.diaspora_android.util.ProxyHandler;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Settings
* Created by gsantner (https://gsantner.github.io/) on 20.03.16. Part of Diaspora for Android.
@ -29,6 +34,7 @@ public class AppSettings {
private final SharedPreferences prefApp;
private final SharedPreferences prefPod;
private final Context context;
private DiasporaPod currentPod0Cached;
public AppSettings(Context context) {
this.context = context.getApplicationContext();
@ -135,24 +141,44 @@ public class AppSettings {
setString(prefPod, R.string.pref_key__podprofile_name, name);
}
public String getPodDomain() {
return getString(prefPod, R.string.pref_key__poddomain, "");
// TODO: Remove legacy at some time ;)
public void upgradeLegacyPoddomain() {
String legacy = getString(prefPod, R.string.pref_key__poddomain_legacy, "");
if (!legacy.equals("")) {
DiasporaPod pod = new DiasporaPod();
pod.setName(legacy);
pod.getPodUrls().add(new DiasporaPodUrl().setHost(legacy));
setPod(pod);
}
}
public void setPodDomain(String podDomain) {
setString(prefPod, R.string.pref_key__poddomain, podDomain);
public DiasporaPod getPod() {
upgradeLegacyPoddomain();
if (currentPod0Cached == null) {
String pref = getString(prefPod, R.string.pref_key__current_pod_0, "");
try {
currentPod0Cached = new DiasporaPod().fromJson(new JSONObject(pref));
} catch (JSONException e) {
currentPod0Cached = null;
}
}
return currentPod0Cached;
}
public boolean hasPodDomain() {
return !getString(prefPod, R.string.pref_key__poddomain, "").equals("");
public void setPod(DiasporaPod pod) {
try {
setString(prefPod, R.string.pref_key__current_pod_0,
pod == null ? null : pod.toJson().toString());
currentPod0Cached = pod;
} catch (JSONException ignored) {
}
}
public String[] getPreviousPodlist() {
return getStringArray(prefApp, R.string.pref_key__previous_podlist);
}
public void setPreviousPodlist(String[] pods) {
setStringArray(prefApp, R.string.pref_key__previous_podlist, pods);
public boolean hasPod() {
upgradeLegacyPoddomain();
return !getString(prefPod, R.string.pref_key__current_pod_0, "").equals("");
}
public void setPodAspects(PodAspect[] aspects) {
@ -238,6 +264,7 @@ public class AppSettings {
public void setProxyHttpHost(String value) {
setString(prefApp, R.string.pref_key__http_proxy_host, value);
}
/**
* Default value: 0
*

View file

@ -0,0 +1,516 @@
package com.github.dfa.diaspora_android.data;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* Created by gsantner (https://gsantner.github.io/ on 30.09.16.
* DiasporaPodList - List container for DiasporaPod's, with methods to merge with other DiasporaPodLists
* DiasporaPod - Data container for a Pod, can include N DiasporaPodUrl's
* DiasporaPodUrl - A Url of an DiasporaPod
* For all Classes a loading and saving to JSON method is available
*/
public class DiasporaPodList implements Iterable<DiasporaPodList.DiasporaPod>, Serializable {
private List<DiasporaPod> pods = new ArrayList<>();
private boolean trackMergeChanges = false;
private Integer trackAddedIndexStart = -1;
private List<Integer> trackUpdatedIndexes = new ArrayList<>();
private boolean keepOldNameDuringMerge = false;
private long timestamp;
public DiasporaPodList() {
}
/**
* Load DiasporaPodList from Json
*
* @param json Json Object
*/
public DiasporaPodList fromJson(JSONObject json) throws JSONException {
JSONArray jarr;
pods.clear();
if (json.has("pods")) {
jarr = json.getJSONArray("pods");
for (int i = 0; i < jarr.length(); i++) {
DiasporaPod pod = new DiasporaPod().fromJson(jarr.getJSONObject(i));
pods.add(pod);
}
}
if (json.has("timestamp")) {
timestamp = json.getLong("timestamp");
}
return this;
}
/**
* Convert DiasporaPodList to JSON
*/
public JSONObject toJson() throws JSONException {
JSONObject json = new JSONObject();
JSONArray jpods = new JSONArray();
for (DiasporaPod pod : pods) {
jpods.put(pod.toJson());
}
json.put("pods", jpods);
json.put("timestamp", System.currentTimeMillis());
return json;
}
/**
* Merge newer entries into this podlist
* Will add new pods, and update data of pods with data from the new list
*
* @param newPodList Another podlist
*/
public void mergeWithNewerEntries(final DiasporaPodList newPodList) throws JSONException {
if (isTrackMergeChanges()) {
trackAddedIndexStart = -1;
trackUpdatedIndexes.clear();
}
for (DiasporaPod newPod : newPodList) {
int index = pods.indexOf(newPod);
if (index >= 0) {
DiasporaPod updatePodBak = new DiasporaPod().fromJson(pods.get(index).toJson());
DiasporaPod updatePod = pods.get(index);
updatePod.fromJson(newPod.toJson());
// Restore Pod id (if was set to zero)
if (updatePodBak.getId() != 0 && updatePod.getId() == 0) {
updatePod.setId(updatePodBak.getId());
}
if (updatePodBak.getActive6() != 0 && updatePod.getActive6() == 0) {
updatePod.setActive6(updatePodBak.getActive6());
}
if (updatePodBak.getScore() != 0 && updatePod.getScore() == 0) {
updatePod.setScore(updatePodBak.getScore());
}
if (!updatePodBak.getName().equals("") && keepOldNameDuringMerge) {
updatePod.setName(updatePodBak.getName());
}
if (isTrackMergeChanges()) {
trackUpdatedIndexes.add(index);
}
} else {
pods.add(newPod);
if (isTrackMergeChanges() && trackAddedIndexStart == -1) {
trackAddedIndexStart = pods.size() - 1;
}
}
}
}
/**
* Sort the pod list
*/
public void sortPods() {
Collections.sort(pods);
}
/**
* Iterator for Iterable interface (forEach, ..)
*/
public Iterator<DiasporaPod> iterator() {
return pods.iterator();
}
public int size() {
return pods.size();
}
public int indexOf(DiasporaPod pod) {
return pods.indexOf(pod);
}
public List<DiasporaPod> getPods() {
return pods;
}
public void setPods(List<DiasporaPod> pods) {
this.pods = pods;
}
public DiasporaPod getPodAt(int index) {
if (index >= 0 && index < pods.size()) {
return pods.get(index);
}
return null;
}
public boolean isTrackMergeChanges() {
return trackMergeChanges;
}
public void setTrackMergeChanges(boolean trackMergeChanges) {
this.trackMergeChanges = trackMergeChanges;
}
public Integer getTrackAddedIndexStart() {
return trackAddedIndexStart;
}
public List<Integer> getTrackUpdatedIndexes() {
return trackUpdatedIndexes;
}
public boolean isKeepOldNameDuringMerge() {
return keepOldNameDuringMerge;
}
public void setKeepOldNameDuringMerge(boolean keepOldNameDuringMerge) {
this.keepOldNameDuringMerge = keepOldNameDuringMerge;
}
/*
*
*
*
*
*
*/
public static class DiasporaPod implements Iterable<DiasporaPodList.DiasporaPod.DiasporaPodUrl>, Comparable<DiasporaPod>, Serializable {
private List<DiasporaPodUrl> podUrls = new ArrayList<>();
private List<String> mainLangs = new ArrayList<>();
private String name = "";
private int score = 0;
private int id = 0;
private long active6 = 0;
public DiasporaPod() {
}
/**
* Load a DiasporaPod from JSON
*
* @param json Json Object
*/
public DiasporaPod fromJson(JSONObject json) throws JSONException {
JSONArray jarr;
if (json.has("name")) {
name = json.getString("name");
}
if (json.has("mainLangs")) {
jarr = json.getJSONArray("mainLangs");
for (int i = 0; i < jarr.length(); i++) {
String val = jarr.getString(i);
if (!mainLangs.contains(val)) {
mainLangs.add(val);
}
}
}
if (json.has("podUrls")) {
jarr = json.getJSONArray("podUrls");
for (int i = 0; i < jarr.length(); i++) {
DiasporaPodUrl podUrl = new DiasporaPodUrl().fromJson(jarr.getJSONObject(i));
if (!podUrls.contains(podUrl)) {
podUrls.add(podUrl);
}
}
}
if (json.has("score")) {
score = json.getInt("score");
}
if (json.has("active6")) {
active6 = json.getLong("active6");
}
if (json.has("id")) {
id = json.getInt("id");
}
return this;
}
/**
* Convert DiasporaPod to JSON
*/
public JSONObject toJson() throws JSONException {
JSONObject json = new JSONObject();
json.put("name", name);
json.put("score", score);
json.put("active6", active6);
json.put("id", id);
// Pod urls
JSONArray jarr = new JSONArray();
for (DiasporaPodUrl value : podUrls) {
jarr.put(value.toJson());
}
json.put("podUrls", jarr);
// main langs
jarr = new JSONArray();
for (String value : mainLangs) {
jarr.put(value);
}
json.put("mainLangs", jarr);
return json;
}
@Override
public boolean equals(Object o) {
boolean ret = false;
if (o instanceof DiasporaPod) {
DiasporaPod otherPod = (DiasporaPod) o;
// Check if id is equal
ret = this.id != 0 && this.id == otherPod.id;
// Check if host is the same (fallback if id is 0)
if (!ret) {
for (DiasporaPodUrl podUrl : podUrls) {
for (DiasporaPodUrl otherPodUrl : otherPod.getPodUrls()) {
if (podUrl.getBaseUrl().equals(otherPodUrl.getBaseUrl())) {
ret = true;
}
}
}
}
}
return ret;
}
@Override
public int compareTo(DiasporaPod otherPod) {
if (otherPod != null) {
List<DiasporaPodUrl> myPodUrls = getPodUrls();
List<DiasporaPodUrl> otherPodUrls = otherPod.getPodUrls();
if (!myPodUrls.isEmpty() && !otherPodUrls.isEmpty()) {
return myPodUrls.get(0).getHost().compareTo(otherPodUrls.get(0).getHost());
}
}
return name.compareTo(otherPod.getName());
}
@Override
public String toString() {
return name + "(" + id + ")";
}
/**
* Iterator for Iterable interface (forEach, ..)
*/
public Iterator<DiasporaPodUrl> iterator() {
return podUrls.iterator();
}
/*
* Getter & Setter
*/
public List<DiasporaPodUrl> getPodUrls() {
return podUrls;
}
public DiasporaPod setPodUrls(List<DiasporaPodUrl> podUrls) {
this.podUrls = podUrls;
return this;
}
public List<String> getMainLangs() {
return mainLangs;
}
public DiasporaPod setMainLangs(List<String> mainLangs) {
this.mainLangs = mainLangs;
return this;
}
public DiasporaPod appendMainLangs(String... values) {
for (String mainLang : values) {
this.mainLangs.add(mainLang);
}
return this;
}
/**
* Returns the first DiasporaPodUrl in the list
*/
public DiasporaPodUrl getPodUrl() {
if (podUrls.size() > 0) {
return podUrls.get(0);
}
return null;
}
public DiasporaPod appendPodUrls(DiasporaPodUrl... values) {
for (DiasporaPodUrl value : values) {
this.podUrls.add(value);
}
return this;
}
public String getName() {
return name;
}
public DiasporaPod setName(String name) {
this.name = name;
return this;
}
public int getScore() {
return score;
}
public DiasporaPod setScore(int score) {
this.score = score;
return this;
}
public long getActive6() {
return active6;
}
public DiasporaPod setActive6(long active6) {
this.active6 = active6;
return this;
}
public int getId() {
return id;
}
public DiasporaPod setId(int id) {
this.id = id;
return this;
}
/*
*
*
*
*
*
*/
public static class DiasporaPodUrl implements Serializable {
private String host = "";
private String protocol = "https";
private Integer port = 443;
public DiasporaPodUrl() {
}
public DiasporaPodUrl(JSONObject json) throws JSONException {
fromJson(json);
}
/**
* Get the base url
*
* @return
*/
public String getBaseUrl() {
return protocol + "://" + host + (isPortNeeded() ? port : "");
}
/**
* Convert JSON to DiasporaPodList
*
* @param json JSON Object
*/
public DiasporaPodUrl fromJson(JSONObject json) throws JSONException {
if (json.has("host")) {
host = json.getString("host");
}
if (json.has("protocol")) {
protocol = json.getString("protocol");
}
if (json.has("port")) {
port = json.getInt("port");
}
return this;
}
/***
* Convert DiasporaPodList to JSON
*/
public JSONObject toJson() throws JSONException {
JSONObject json = new JSONObject();
json.put("host", host);
if (!protocol.equals("https")) {
json.put("protocol", protocol);
}
if (port != 443) {
json.put("port", port);
}
return json;
}
/**
* Set default values for https
*/
public void setHttpsDefaults() {
setProtocol("https");
setPort(443);
}
/**
* Set default values for http
*/
public void setHttpDefaults() {
setProtocol("http");
setPort(80);
}
/**
* Tells if the ports needs to shown
*/
public boolean isPortNeeded() {
return !((port == 80 && protocol.equals("http")) || (port == 443 && protocol.equals("https")));
}
@Override
public String toString() {
return getBaseUrl();
}
@Override
public boolean equals(Object o) {
if (o instanceof DiasporaPodUrl) {
return getBaseUrl().equals(((DiasporaPodUrl) o).getBaseUrl());
}
return false;
}
/*
* GETTER & SETTER
*/
public String getHost() {
return host;
}
public DiasporaPodUrl setHost(String host) {
this.host = host;
return this;
}
public String getProtocol() {
return protocol;
}
public DiasporaPodUrl setProtocol(String protocol) {
this.protocol = protocol;
return this;
}
public Integer getPort() {
return port;
}
public DiasporaPodUrl setPort(Integer port) {
this.port = port;
return this;
}
}
}
}

View file

@ -70,8 +70,8 @@ public class PodAspect {
public String toHtmlLink(final App app) {
final AppSettings appSettings = app.getSettings();
return String.format(Locale.getDefault(),
"<a href='https://%s/aspects?a_ids[]=%d' style='color: #000000; text-decoration: none;'>%s</a>",
appSettings.getPodDomain(), id, name);
"<a href='%s/aspects?a_ids[]=%d' style='color: #000000; text-decoration: none;'>%s</a>",
appSettings.getPod().getPodUrl().getBaseUrl(), id, name);
}
@Override

View file

@ -20,11 +20,9 @@ package com.github.dfa.diaspora_android.data;
import android.os.Handler;
import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.Log;
import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.listener.WebUserProfileChangedListener;
import com.github.dfa.diaspora_android.util.AppLog;
import org.json.JSONArray;
import org.json.JSONException;
@ -173,6 +171,7 @@ public class PodUserProfile {
/**
* Sets the avatar, returns true if this was a new one, false if already the old one
*
* @param avatarUrl url
* @return true if new avatar url
*/

View file

@ -41,10 +41,10 @@ import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.activity.MainActivity;
import com.github.dfa.diaspora_android.data.AppSettings;
import com.github.dfa.diaspora_android.util.ProxyHandler;
import com.github.dfa.diaspora_android.ui.ContextMenuWebView;
import com.github.dfa.diaspora_android.util.theming.ThemeHelper;
import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.ProxyHandler;
import com.github.dfa.diaspora_android.util.theming.ThemeHelper;
import com.github.dfa.diaspora_android.webview.CustomWebViewClient;
import com.github.dfa.diaspora_android.webview.ProgressBarWebChromeClient;

View file

@ -34,6 +34,7 @@ public abstract class CustomFragment extends Fragment {
/**
* We have an optionsMenu
*
* @param savedInstanceState state
*/
@Override
@ -44,12 +45,14 @@ public abstract class CustomFragment extends Fragment {
/**
* Return the tag used to identify the Fragment.
*
* @return tag
*/
public abstract String getFragmentTag();
/**
* Add fragment-dependent options to the bottom options toolbar
*
* @param menu bottom menu
* @param inflater inflater
*/
@ -58,6 +61,7 @@ public abstract class CustomFragment extends Fragment {
/**
* Return true if the fragment reacted to a back button press, false else.
* In case the fragment returned false, the parent activity should handle the backPress.
*
* @return did we react to the back press?
*/
public abstract boolean onBackPressed();

View file

@ -44,12 +44,12 @@ import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.activity.MainActivity;
import com.github.dfa.diaspora_android.data.PodUserProfile;
import com.github.dfa.diaspora_android.webview.DiasporaStreamWebChromeClient;
import com.github.dfa.diaspora_android.webview.FileUploadWebChromeClient;
import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import com.github.dfa.diaspora_android.util.Helpers;
import com.github.dfa.diaspora_android.util.WebHelper;
import com.github.dfa.diaspora_android.webview.DiasporaStreamWebChromeClient;
import com.github.dfa.diaspora_android.webview.FileUploadWebChromeClient;
import org.json.JSONException;
@ -228,6 +228,7 @@ public class DiasporaStreamFragment extends BrowserFragment {
public String getSharedText() {
return ((MainActivity) getActivity()).getTextToBeShared();
}
@Override
public void setSharedText(String shared) {
((MainActivity) getActivity()).setTextToBeShared(shared);
@ -261,7 +262,8 @@ public class DiasporaStreamFragment extends BrowserFragment {
}
}
AppLog.v(this, "onOpenFileChooser");
if (imageUploadFilePathCallbackNew != null) imageUploadFilePathCallbackNew.onReceiveValue(null);
if (imageUploadFilePathCallbackNew != null)
imageUploadFilePathCallbackNew.onReceiveValue(null);
imageUploadFilePathCallbackNew = filePathCallback;
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getContext().getPackageManager()) != null) {

View file

@ -18,20 +18,16 @@
*/
package com.github.dfa.diaspora_android.fragment;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.content.LocalBroadcastManager;
import android.text.Editable;
import android.text.SpannableString;
import android.text.TextWatcher;
import android.text.util.Linkify;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.SearchView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@ -41,74 +37,98 @@ import android.view.ViewGroup;
import android.webkit.CookieManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.activity.MainActivity;
import com.github.dfa.diaspora_android.data.AppSettings;
import com.github.dfa.diaspora_android.data.DiasporaPodList;
import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod;
import com.github.dfa.diaspora_android.task.GetPodsService;
import com.github.dfa.diaspora_android.ui.PodSelectionDialog;
import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import com.github.dfa.diaspora_android.util.WebHelper;
import com.github.dfa.diaspora_android.util.Helpers;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
/**
* Fragment that lets the user choose a Pod
* Created by vanitas on 01.10.16.
*/
public class PodSelectionFragment extends CustomFragment {
public class PodSelectionFragment extends CustomFragment implements SearchView.OnQueryTextListener, PodSelectionDialog.PodSelectionDialogResultListener {
public static final String TAG = "com.github.dfa.diaspora_android.PodSelectionFragment";
protected EditText editFilter;
protected ListView listPods;
protected ImageView selectPodButton;
@BindView(R.id.podselection__fragment__listpods)
protected ListView listViewPod;
protected App app;
protected AppSettings appSettings;
private DiasporaPodList podList;
private ArrayAdapter<String> listViewPodAdapter;
private String filterString = "";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
AppLog.d(this, "onCreateView()");
return inflater.inflate(R.layout.podselection__fragment, container, false);
View view = inflater.inflate(R.layout.podselection__fragment, container, false);
ButterKnife.bind(this, view);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
this.app = (App) getActivity().getApplication();
this.appSettings = app.getSettings();
app = (App) getActivity().getApplication();
appSettings = app.getSettings();
this.editFilter = (EditText) view.findViewById(R.id.podselection__edit_filter);
this.listPods = (ListView) view.findViewById(R.id.podselection__listpods);
this.selectPodButton = (ImageView) view.findViewById(R.id.podselection__button_select_pod);
// Load local podlist
podList = new DiasporaPodList();
mergePodlistWithRessources(podList);
podList.setTrackMergeChanges(true);
updateListedPods();
listPods.setTextFilterEnabled(true);
listPods.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
listViewPod.setTextFilterEnabled(true);
listViewPod.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
showPodConfirmationDialog((String) listPods.getAdapter().getItem(i));
String text = ((TextView) view).getText().toString();
for (DiasporaPod pod : podList) {
if (pod.getPodUrl().getHost().equals(text)) {
showPodSelectionDialog(pod);
return;
}
}
}
});
setListedPods(appSettings.getPreviousPodlist());
LocalBroadcastManager.getInstance(getContext()).registerReceiver(podListReceiver, new IntentFilter(GetPodsService.MESSAGE_PODS_RECEIVED));
if (!WebHelper.isOnline(getContext())) {
Snackbar.make(listPods, R.string.no_internet, Snackbar.LENGTH_LONG).show();
Helpers.showInfoIfUserNotConnectedToInternet(getContext(), listViewPod);
}
selectPodButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (editFilter.getText().length() > 4 && editFilter.getText().toString().contains("")) {
showPodConfirmationDialog(editFilter.getText().toString());
} else {
Snackbar.make(listPods, R.string.valid_pod, Snackbar.LENGTH_LONG).show();
public void mergePodlistWithRessources(DiasporaPodList podlist) {
String sPodlist = Helpers.readTextfileFromRawRessource(getContext(), R.raw.podlist, "", "");
try {
JSONObject jPodlist = new JSONObject(sPodlist);
podlist.mergeWithNewerEntries(new DiasporaPodList().fromJson(jPodlist));
} catch (JSONException e) {
e.printStackTrace();
}
}
});
@OnClick(R.id.podselection__fragment__button_use_custom_pod)
public void onPodButtonClicked(View v) {
showPodSelectionDialog(new DiasporaPod());
}
@Override
@ -116,28 +136,20 @@ public class PodSelectionFragment extends CustomFragment {
return TAG;
}
@Override
public void onCreateBottomOptionsMenu(Menu menu, MenuInflater inflater) {
/* Nothing to do */
}
@Override
public boolean onBackPressed() {
return false;
}
private final BroadcastReceiver podListReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.hasExtra("pods")) {
if (intent.hasExtra(GetPodsService.EXTRA_PODLIST)) {
Bundle extras = intent.getExtras();
String[] pods = extras.getStringArray("pods");
if (pods != null && pods.length > 0) {
app.getSettings().setPreviousPodlist(pods);
setListedPods(pods);
DiasporaPodList newPods = (DiasporaPodList) extras.get(GetPodsService.EXTRA_PODLIST);
if (newPods != null && newPods.getPods().size() > 0) {
try {
podList.mergeWithNewerEntries(newPods);
updateListedPods();
} catch (JSONException ignored) {
}
} else {
setListedPods(app.getSettings().getPreviousPodlist());
Snackbar.make(listPods, R.string.podlist_error, Snackbar.LENGTH_SHORT).show();
Snackbar.make(listViewPod, R.string.podlist_error, Snackbar.LENGTH_SHORT).show();
}
}
}
@ -150,67 +162,78 @@ public class PodSelectionFragment extends CustomFragment {
getContext().startService(i);
}
private void setListedPods(String[] listedPodsArr) {
private void updateListedPods() {
final ArrayList<String> listedPodsList = new ArrayList<>();
for (String pod : listedPodsArr) {
listedPodsList.add(pod.toLowerCase());
for (DiasporaPod pod : this.podList) {
listedPodsList.add(pod.getPodUrl().getHost());
}
final ArrayAdapter<String> adapter = new ArrayAdapter<>(
listViewPodAdapter = new ArrayAdapter<>(
getContext(),
android.R.layout.simple_list_item_1,
listedPodsList);
// save index and top position
int index = listPods.getFirstVisiblePosition();
View v = listPods.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - listPods.getPaddingTop());
listPods.setAdapter(adapter);
listPods.setSelectionFromTop(index, top);
int index = listViewPod.getFirstVisiblePosition();
View v = listViewPod.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - listViewPod.getPaddingTop());
listViewPod.setAdapter(listViewPodAdapter);
listViewPod.setSelectionFromTop(index, top);
listViewPodAdapter.getFilter().filter(filterString);
}
private void showPodSelectionDialog(final DiasporaPod selectedPod) {
PodSelectionDialog dialog = PodSelectionDialog.newInstance(selectedPod, this);
dialog.show(getFragmentManager(), PodSelectionDialog.TAG);
}
adapter.getFilter().filter(editFilter.getText());
editFilter.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
(adapter).getFilter().filter(s.toString());
public void onDestroy() {
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(podListReceiver);
super.onDestroy();
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.podselection__menu, menu);
MenuItem searchItem = menu.findItem(R.id.podselection__action_search);
if (searchItem != null) {
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(this);
}
public void afterTextChanged(Editable s) {
}
});
super.onCreateOptionsMenu(menu, inflater);
}
private void showPodConfirmationDialog(final String selectedPod) {
// Make a clickable link
final SpannableString dialogMessage = new SpannableString(getString(R.string.confirm_pod, selectedPod));
Linkify.addLinks(dialogMessage, Linkify.ALL);
// Check if online
if (!WebHelper.isOnline(getContext())) {
Snackbar.make(listPods, R.string.no_internet, Snackbar.LENGTH_LONG).show();
return;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_reload: {
if (!Helpers.showInfoIfUserNotConnectedToInternet(getContext(), listViewPod)) {
Intent i = new Intent(getContext(), GetPodsService.class);
getContext().startService(i);
return true;
}
}
}
return super.onOptionsItemSelected(item);
}
// Show dialog
new AlertDialog.Builder(getContext())
.setTitle(getString(R.string.confirmation))
.setMessage(dialogMessage)
.setPositiveButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
onPodSelectionConfirmed(selectedPod);
@Override
public boolean onQueryTextChange(String newText) {
if (listViewPodAdapter != null) {
(listViewPodAdapter).getFilter().filter(newText);
}
})
.setNegativeButton(android.R.string.no, null)
.show();
return true;
}
private void onPodSelectionConfirmed(String selectedPod) {
app.getSettings().setPodDomain(selectedPod);
@Override
public void onPodSelectionDialogResult(DiasporaPod pod, boolean accepted) {
System.out.println(accepted + ": " + pod.toString());
if (accepted) {
app.getSettings().setPod(pod);
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
@ -226,35 +249,29 @@ public class PodSelectionFragment extends CustomFragment {
e.printStackTrace();
}
((MainActivity)getActivity()).openDiasporaUrl(new DiasporaUrlHelper(appSettings).getPodUrl());
MainActivity mainActivity = (MainActivity) getActivity();
DiasporaUrlHelper urlHelper = new DiasporaUrlHelper(appSettings);
mainActivity.invalidateOptionsMenu();
mainActivity.openDiasporaUrl(urlHelper.getSignInUrl());
}
}
/*
* Dummy implementations
*/
@Override
public void onCreateBottomOptionsMenu(Menu menu, MenuInflater inflater) {
}
@Override
public void onDestroy() {
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(podListReceiver);
super.onDestroy();
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.podselection__menu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_reload: {
if (WebHelper.isOnline(getContext())) {
Intent i = new Intent(getContext(), GetPodsService.class);
getContext().startService(i);
return true;
} else {
Snackbar.make(listPods, R.string.no_internet, Snackbar.LENGTH_LONG).show();
public boolean onBackPressed() {
return false;
}
}
}
return super.onOptionsItemSelected(item);
}
}

View file

@ -24,24 +24,24 @@ import android.os.AsyncTask;
import android.os.IBinder;
import android.support.v4.content.LocalBroadcastManager;
import com.github.dfa.diaspora_android.data.DiasporaPodList;
import com.github.dfa.diaspora_android.util.AppLog;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import javax.net.ssl.HttpsURLConnection;
import info.guardianproject.netcipher.NetCipher;
public class GetPodsService extends Service {
public static final String EXTRA_PODLIST = "pods";
public static final String MESSAGE_PODS_RECEIVED = "com.github.dfa.diaspora.podsreceived";
public static final String PODDY_PODLIST_URL = "https://raw.githubusercontent.com/Diaspora-for-Android/diaspora-android-extras/master/podList/podlist.json";
public GetPodsService() {
}
@ -53,75 +53,48 @@ public class GetPodsService extends Service {
}
private void getPods() {
/*
* Most of the code in this AsyncTask is from the file getPodlistTask.java
* from the app "Diaspora Webclient".
* A few modifications and adaptations were made by me.
* Source:
* https://github.com/voidcode/Diaspora-Webclient/blob/master/src/com/voidcode/diasporawebclient/getPodlistTask.java
* Thanks to Terkel Sørensen ; License : GPLv3
*/
AsyncTask<Void, Void, String[]> getPodsAsync = new AsyncTask<Void, Void, String[]>() {
AsyncTask<Void, Void, DiasporaPodList> getPodsAsync = new AsyncTask<Void, Void, DiasporaPodList>() {
@Override
protected String[] doInBackground(Void... params) {
// TODO: Update deprecated code
StringBuilder builder = new StringBuilder();
//HttpClient client = new DefaultHttpClient();
List<String> list = null;
HttpsURLConnection connection;
InputStream inStream;
protected DiasporaPodList doInBackground(Void... params) {
StringBuilder sb = new StringBuilder();
BufferedReader br = null;
try {
connection = NetCipher.getHttpsURLConnection("https://podupti.me/api.php?key=4r45tg&format=json");
int statusCode = connection.getResponseCode();
if (statusCode == 200) {
inStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(inStream));
HttpsURLConnection con = NetCipher.getHttpsURLConnection(PODDY_PODLIST_URL);
if (con.getResponseCode() == HttpsURLConnection.HTTP_OK) {
br = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
while ((line = br.readLine()) != null) {
sb.append(line);
}
try {
inStream.close();
} catch (IOException e) {/*Nothing to do*/}
connection.disconnect();
// Parse JSON & return pod list
JSONObject json = new JSONObject(sb.toString());
return new DiasporaPodList().fromJson(json);
} else {
AppLog.e(this, "Failed to download list of pods");
}
} catch (IOException e) {
//TODO handle json buggy feed
} catch (IOException | JSONException e) {
e.printStackTrace();
}
//Parse the JSON Data
} finally {
if (br != null) {
try {
JSONObject jsonObjectAll = new JSONObject(builder.toString());
JSONArray jsonArrayAll = jsonObjectAll.getJSONArray("pods");
AppLog.d(this, "Number of entries " + jsonArrayAll.length());
list = new ArrayList<>();
for (int i = 0; i < jsonArrayAll.length(); i++) {
JSONObject jo = jsonArrayAll.getJSONObject(i);
if (jo.getString("secure").equals("true"))
list.add(jo.getString("domain"));
br.close();
} catch (IOException ignored) {
}
}
}
} catch (Exception e) {
//TODO Handle Parsing errors here
e.printStackTrace();
}
if (list != null)
return list.toArray(new String[list.size()]);
else
return null;
// Could not fetch list of pods :(
return new DiasporaPodList();
}
@Override
protected void onPostExecute(String[] pods) {
protected void onPostExecute(DiasporaPodList pods) {
if (pods == null) {
pods = new DiasporaPodList();
}
Intent broadcastIntent = new Intent(MESSAGE_PODS_RECEIVED);
broadcastIntent.putExtra("pods", pods != null ? pods : new String[0]);
broadcastIntent.putExtra(EXTRA_PODLIST, pods);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(broadcastIntent);
stopSelf();
}

View file

@ -22,12 +22,9 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.annotation.Nullable;
import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.Log;
import android.widget.ImageView;
import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.util.AppLog;
import java.io.FileOutputStream;
import java.io.IOException;

View file

@ -20,13 +20,11 @@ package com.github.dfa.diaspora_android.task;
import android.content.Context;
import android.os.AsyncTask;
import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.Log;
import android.webkit.CookieManager;
import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.data.PodUserProfile;
import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import java.io.BufferedReader;

View file

@ -20,12 +20,10 @@ package com.github.dfa.diaspora_android.task;
import android.content.Context;
import android.os.AsyncTask;
import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.Log;
import android.webkit.CookieManager;
import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import java.io.BufferedReader;

View file

@ -9,6 +9,8 @@ import android.support.design.widget.AppBarLayout;
public interface IntellihideToolbarActivityListener {
int toolbarDefaultScrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS | AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP;
void enableToolbarHiding();
void disableToolbarHiding();
}

View file

@ -0,0 +1,195 @@
package com.github.dfa.diaspora_android.ui;
import android.app.Dialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatDialogFragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod;
import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod.DiasporaPodUrl;
import org.json.JSONException;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.OnItemSelected;
/**
* Created by gsantner (https://gsantner.github.io) on 06.10.16.
*/
public class PodSelectionDialog extends AppCompatDialogFragment {
public static final String TAG = "com.github.dfa.diaspora_android.PodSelectionDialog";
public static interface PodSelectionDialogResultListener {
void onPodSelectionDialogResult(DiasporaPod pod, boolean accepted);
}
public static PodSelectionDialog newInstance(PodSelectionDialogResultListener resultListener) {
return newInstance(new DiasporaPod(), resultListener);
}
public static PodSelectionDialog newInstance(DiasporaPod pod, PodSelectionDialogResultListener resultListener) {
PodSelectionDialog dialog = new PodSelectionDialog();
dialog.setPod(pod);
dialog.setResultListener(resultListener);
return dialog;
}
/*
//
//
//
//
//
//
*/
@BindView(R.id.podselection__dialog__edit_podaddress)
EditText editPodAddress;
@BindView(R.id.podselection__dialog__edit_podname)
EditText editPodName;
@BindView(R.id.podselection__dialog__radiogroup_protocol)
RadioGroup radiogrpProtocol;
@BindView(R.id.podselection__dialog__text_profile)
TextView textProfile;
@BindView(R.id.podselection__dialog__spinner_profile)
Spinner spinnerProfile;
private PodSelectionDialogResultListener resultListener;
private View root;
private DiasporaPod pod = new DiasporaPod();
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
// Bind UI
root = inflater.inflate(R.layout.podselection__dialog, null);
ButterKnife.bind(this, root);
editPodName.setText(pod.getName());
List<DiasporaPodUrl> podUrls = pod.getPodUrls();
if (podUrls.size() > 0) {
uiLoadDiasporaUrl(0);
}
if (podUrls.size() > 1) {
textProfile.setVisibility(View.VISIBLE);
spinnerProfile.setVisibility(View.VISIBLE);
String[] podUrlss = new String[podUrls.size()];
for (int i = 0; i < podUrls.size(); podUrlss[i] = podUrls.get(i++).getBaseUrl()) ;
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, podUrlss);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerProfile.setAdapter(spinnerAdapter);
}
builder.setView(root);
return builder.create();
}
@OnItemSelected(R.id.podselection__dialog__spinner_profile)
public void spinnerItemSelected(Spinner spinner, int position) {
uiLoadDiasporaUrl(position);
}
public void uiLoadDiasporaUrl(int wantedPodUrlPos) {
List<DiasporaPodUrl> podUrls = pod.getPodUrls();
if (podUrls.size() == 0) {
return;
}
wantedPodUrlPos = wantedPodUrlPos < podUrls.size() ? wantedPodUrlPos : 0;
DiasporaPodUrl url1 = podUrls.get(wantedPodUrlPos);
editPodAddress.setText(url1.getHost());
radiogrpProtocol.check(url1.getProtocol().equals("https")
? R.id.podselection__dialog__radio_https : R.id.podselection__dialog__radio_http);
}
@OnClick({R.id.podselection__dialog__btn_ok, R.id.podselection__dialog__btn_cancel})
public void onResultButtonClicked(View view) {
boolean POSITIVE_PRESSED = view.getId() == R.id.podselection__dialog__btn_ok;
if (POSITIVE_PRESSED) {
if (!checkInputs()) {
return;
}
DiasporaPodUrl podUrl = new DiasporaPodUrl();
if (radiogrpProtocol.getCheckedRadioButtonId() == R.id.podselection__dialog__radio_https) {
podUrl.setHttpsDefaults();
} else {
podUrl.setHttpDefaults();
}
podUrl.setHost(editPodAddress.getText().toString());
pod.setName(editPodName.getText().toString());
pod.getPodUrls().clear();
pod.getPodUrls().add(podUrl);
getDialog().dismiss();
publishResult(POSITIVE_PRESSED);
} else {
getDialog().cancel();
publishResult(POSITIVE_PRESSED);
}
}
public boolean checkInputs() {
boolean ok = true;
String s = editPodAddress.getText().toString();
if (TextUtils.isEmpty(s) || s.length() < 3) {
editPodAddress.setError(getString(R.string.missing_value));
ok = false;
}
s = editPodName.getText().toString();
if (TextUtils.isEmpty(s) || s.length() < 3) {
editPodName.setError(getString(R.string.missing_value));
ok = false;
}
return ok;
}
public void publishResult(boolean accepted) {
if (resultListener != null) {
resultListener.onPodSelectionDialogResult(pod, accepted);
}
}
/*
* GETTER & SETTER
*/
public PodSelectionDialogResultListener getResultListener() {
return resultListener;
}
public void setResultListener(PodSelectionDialogResultListener resultListener) {
this.resultListener = resultListener;
}
public DiasporaPod getPod() {
return pod;
}
public void setPod(DiasporaPod pod) {
try {
this.pod = new DiasporaPod().fromJson(pod.toJson());
} catch (JSONException ignored) {
}
}
}

View file

@ -26,7 +26,6 @@ import android.support.customtabs.CustomTabsClient;
import android.support.customtabs.CustomTabsIntent;
import android.support.customtabs.CustomTabsServiceConnection;
import android.support.customtabs.CustomTabsSession;
import android.util.Log;
import java.util.List;
@ -68,6 +67,7 @@ public class CustomTabActivityHelper {
/**
* Unbinds the Activity from the Custom Tabs Service
*
* @param activity the activity that is connected to the service
*/
public void unbindCustomTabsService(Activity activity) {
@ -93,6 +93,7 @@ public class CustomTabActivityHelper {
/**
* Register a Callback to be called when connected or disconnected from the Custom Tabs Service
*
* @param connectionCallback
*/
public void setConnectionCallback(ConnectionCallback connectionCallback) {
@ -101,6 +102,7 @@ public class CustomTabActivityHelper {
/**
* Binds the Activity to the Custom Tabs Service
*
* @param activity the activity to be binded to the service
*/
public void bindCustomTabsService(Activity activity) {
@ -161,7 +163,6 @@ public class CustomTabActivityHelper {
*/
public interface CustomTabFallback {
/**
*
* @param activity The Activity that wants to open the Uri
* @param uri The uri to be opened by the fallback
*/

View file

@ -26,7 +26,6 @@ import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.support.customtabs.CustomTabsService;
import android.text.TextUtils;
import android.util.Log;
import com.github.dfa.diaspora_android.util.AppLog;
@ -47,13 +46,14 @@ public class CustomTabsHelper {
private static String sPackageNameToUse;
private CustomTabsHelper() {}
private CustomTabsHelper() {
}
/**
* Goes through all apps that handle VIEW intents and have a warmup service. Picks
* the one chosen by the user if there is one, otherwise makes a best effort to return a
* valid package name.
*
* <p>
* This is <strong>not</strong> threadsafe.
*
* @param context {@link Context} to use for accessing {@link PackageManager}.
@ -107,6 +107,7 @@ public class CustomTabsHelper {
/**
* Used to check whether there is a specialized handler for a given intent.
*
* @param intent The intent to check with.
* @return Whether there is a specialized handler for the given intent.
*/

View file

@ -21,6 +21,7 @@ package com.github.dfa.diaspora_android.util;
import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.data.AppSettings;
import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod;
import com.github.dfa.diaspora_android.data.PodAspect;
/**
@ -31,7 +32,6 @@ import com.github.dfa.diaspora_android.data.PodAspect;
public class DiasporaUrlHelper {
private final AppSettings settings;
public static final String HTTPS = "https://";
public static final String SUBURL_NOTIFICATIONS = "/notifications";
public static final String SUBURL_POSTS = "/posts/";
public static final String SUBURL_STREAM = "/stream";
@ -49,6 +49,10 @@ public class DiasporaUrlHelper {
public static final String SUBURL_FOLOWED_TAGS = "/followed_tags";
public static final String SUBURL_ASPECTS = "/aspects";
public static final String SUBURL_STATISTICS = "/statistics";
public static final String SUBURL_PERSONAL_SETTINGS = "/user/edit";
public static final String SUBURL_MANAGE_TAGS = "/tag_followings/manage";
public static final String SUBURL_SIGN_IN = "/users/sign_in";
public static final String SUBURL_MANAGE_CONTACTS = "/contacts";
public static final String URL_BLANK = "about:blank";
public DiasporaUrlHelper(AppSettings settings) {
@ -56,17 +60,22 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url of the pod set in AppSettings.
* Return a url of the pod set in AppSettings.
* Eg. https://pod.geraspora.de
*
* @return https://(pod-domain.tld)
*/
public String getPodUrl() {
return HTTPS + settings.getPodDomain();
DiasporaPod pod = settings.getPod();
if (pod != null) {
return pod.getPodUrl().getBaseUrl();
}
return "http://127.0.0.1";
}
/**
* Return a https url that points to the stream of the configured diaspora account
* Return a url that points to the stream of the configured diaspora account
*
* @return https://(pod-domain.tld)/stream
*/
@ -75,7 +84,7 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that points to the notifications feed of the configured diaspora account
* Return a url that points to the notifications feed of the configured diaspora account
*
* @return https://(pod-domain.tld)/notifications
*/
@ -84,7 +93,7 @@ public class DiasporaUrlHelper {
}
/**
* Returns a https url that points to the post with the id postId
* Returns a url that points to the post with the id postId
*
* @return https://(pod-domain.tld)/posts/(postId)
*/
@ -93,7 +102,7 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that points to the conversations overview of the registered diaspora account
* Return a url that points to the conversations overview of the registered diaspora account
*
* @return https://(pod-domain.tld)/conversations
*/
@ -102,7 +111,7 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that points to the new-post form that lets the user create a new post
* Return a url that points to the new-post form that lets the user create a new post
*
* @return https://(pod-domain.tld)/status_messages/new
*/
@ -111,7 +120,7 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that shows the profile of the currently registered diaspora account
* Return a url that shows the profile of the currently registered diaspora account
*
* @return https://(pod-domain.tld)/people/(profileId)
*/
@ -120,7 +129,7 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that shows the profile of the user with user id profileId
* Return a url that shows the profile of the user with user id profileId
*
* @param profileId Id of the profile to be shown
* @return https://(pod-domain.tld)/people/(profileId)
@ -130,7 +139,7 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that points to the activities feed of the currently registered diaspora account
* Return a url that points to the activities feed of the currently registered diaspora account
*
* @return https://(pod-domain.tld)/activity
*/
@ -139,7 +148,7 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that points to the feed of posts that were liked by the currently registered diaspora account
* Return a url that points to the feed of posts that were liked by the currently registered diaspora account
*
* @return https://(pod-domain.tld)/liked
*/
@ -148,7 +157,7 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that points to the stream of posts that were commented by the currently registered diaspora account
* Return a url that points to the stream of posts that were commented by the currently registered diaspora account
*
* @return https://(pod-domain.tld)/commented
*/
@ -157,7 +166,7 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that points to the stream of posts in which the currently registered diaspora account has been mentioned in
* Return a url that points to the stream of posts in which the currently registered diaspora account has been mentioned in
*
* @return https://(pod-domain.tld)/mentions
*/
@ -166,7 +175,7 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that points to the stream of public posts
* Return a url that points to the stream of public posts
*
* @return https://(pod-domain.tld)/public
*/
@ -175,7 +184,7 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that toggles between mobile and desktop view when opened
* Return a url that toggles between mobile and desktop view when opened
*
* @return https://(pod-domain.tld)/mobile/toggle
*/
@ -184,7 +193,7 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that queries posts for the given hashtag query
* Return a url that queries posts for the given hashtag query
*
* @param query hashtag to be searched
* @return https://(pod-domain.tld)/tags/query
@ -194,7 +203,7 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that queries user accounts for query
* Return a url that queries user accounts for query
*
* @param query search term
* @return https://(pod-domain.tld)/people.mobile?q=(query)
@ -204,13 +213,50 @@ public class DiasporaUrlHelper {
}
/**
* Return a https url that points to the statistics page of the pod.
* Return a url that points to the statistics page of the pod.
*
* @return https://(pod-domain.tld)/statistics
*/
public String getStatisticsUrl() {
return getPodUrl() + SUBURL_STATISTICS;
}
/**
* Return a url that points to the sign in page of the pod.
*
* @return https://(pod-domain.tld)/users/sign_in
*/
public String getSignInUrl() {
return getPodUrl() + SUBURL_SIGN_IN;
}
/**
* Return a url that points to the personal settings page of the pod.
*
* @return https://(pod-domain.tld)/user/edit
*/
public String getPersonalSettingsUrl() {
return getPodUrl() + SUBURL_PERSONAL_SETTINGS;
}
/**
* Return a url that points to the manage tags page of the pod.
*
* @return https://(pod-domain.tld)/tag_followings/manage
*/
public String getManageTagsUrl() {
return getPodUrl() + SUBURL_MANAGE_TAGS;
}
/**
* Return a url that points to the manage tags page of the pod.
*
* @return https://(pod-domain.tld)/contacts
*/
public String getManageContactsUrl() {
return getPodUrl() + SUBURL_MANAGE_CONTACTS;
}
/**
* Returns the url of the blank WebView
*

View file

@ -26,8 +26,9 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.support.design.widget.Snackbar;
import android.view.View;
import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R;
import java.io.BufferedReader;
@ -134,4 +135,18 @@ public class Helpers {
}
}
}
/**
* Show Information if user is offline, returns true if is not connected to internet
*
* @param context Context
* @param anchor A view anchor
*/
public static boolean showInfoIfUserNotConnectedToInternet(Context context, View anchor) {
boolean isOnline = WebHelper.isOnline(context);
if (!isOnline) {
Snackbar.make(anchor, R.string.no_internet, Snackbar.LENGTH_LONG).show();
}
return !isOnline;
}
}

View file

@ -43,6 +43,7 @@ public class Log extends Observable {
private Log() {
this(null);
}
private Log(AppSettings appSettings) {
if (appSettings != null) {
//TODO: Store/Restore logBuffer between app starts

View file

@ -139,16 +139,17 @@ public class WebHelper {
// Content
AppSettings appSettings = app.getSettings();
String pod0BaseUrl = appSettings.getPod().getPodUrl().getBaseUrl();
sb.append("<span style='margin-left: 30px; '></span>&raquo; &nbsp;");
sb.append(String.format(Locale.getDefault(),
"<a href='https://%s/followed_tags' style='color: #000000; text-decoration: none;'><b>%s</b></a>",
appSettings.getPodDomain(), app.getString(R.string.all_tags)));
"<a href='%s/followed_tags' style='color: #000000; text-decoration: none;'><b>%s</b></a>",
pod0BaseUrl, app.getString(R.string.all_tags)));
sb.append("<hr style='height:5px;' />");
for (String tag : profile.getFollowedTags()) {
sb.append("<span style='margin-left: 30px; '></span>&raquo; &nbsp;");
sb.append(String.format(Locale.getDefault(),
"<a href='https://%s/tags/%s' style='color: #000000; text-decoration: none;'>#%s</a>",
appSettings.getPodDomain(), tag, tag));
"<a href='%s/tags/%s' style='color: #000000; text-decoration: none;'>#%s</a>",
pod0BaseUrl, tag, tag));
sb.append("<hr style='height:5px;' />");
}

View file

@ -54,7 +54,8 @@ public class ThemeHelper {
}
public static ThemeHelper getInstance() {
if(instance == null) throw new IllegalStateException("ThemeHelper must be initialized using getInstance(AppSettings) before it can be used!");
if (instance == null)
throw new IllegalStateException("ThemeHelper must be initialized using getInstance(AppSettings) before it can be used!");
return instance;
}

View file

@ -19,7 +19,6 @@
package com.github.dfa.diaspora_android.webview;
import android.content.Intent;
import android.net.Uri;
import android.support.v4.content.LocalBroadcastManager;
import android.webkit.CookieManager;
import android.webkit.WebView;
@ -39,7 +38,7 @@ public class CustomWebViewClient extends WebViewClient {
//Open non-diaspora links in customtab/external browser
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (!url.contains(app.getSettings().getPodDomain())) {
if (!url.contains(app.getSettings().getPod().getPodUrl().getHost())) {
Intent i = new Intent(MainActivity.ACTION_OPEN_EXTERNAL_URL);
i.putExtra(MainActivity.EXTRA_URL, url);
LocalBroadcastManager.getInstance(app.getApplicationContext()).sendBroadcast(i);
@ -57,7 +56,7 @@ public class CustomWebViewClient extends WebViewClient {
if (cookies != null) {
cookieManager.setCookie(url, cookies);
cookieManager.setCookie("https://" + app.getSettings().getPodDomain(), cookies);
cookieManager.setCookie(app.getSettings().getPod().getPodUrl().getBaseUrl(), cookies);
//for (String c : cookies.split(";")) {
//AppLog.d(this, "Cookie: " + c.split("=")[0] + " Value:" + c.split("=")[1]);
//}

View file

@ -39,7 +39,7 @@ public class DiasporaStreamWebChromeClient extends FileUploadWebChromeClient {
@Override
public void onProgressChanged(WebView wv, int progress) {
super.onProgressChanged(wv, progress);
if (progress > 0 && progress <= 60) {
if (progress > 10 && progress <= 60) {
WebHelper.getUserProfile(wv);
WebHelper.optimizeMobileSiteLayout(wv);
}
@ -57,6 +57,7 @@ public class DiasporaStreamWebChromeClient extends FileUploadWebChromeClient {
public interface SharedTextCallback {
String getSharedText();
void setSharedText(String shared);
}
}

View file

@ -42,8 +42,7 @@ public class FileUploadWebChromeClient extends ProgressBarWebChromeClient {
//For Android 4.1/4.2 only. DO NOT REMOVE!
@SuppressWarnings("unused")
protected void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture)
{
protected void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
fileUploadCallback.legacyImageUpload(uploadMsg, acceptType, capture);
}
@ -54,6 +53,7 @@ public class FileUploadWebChromeClient extends ProgressBarWebChromeClient {
public interface FileUploadCallback {
boolean imageUpload(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams);
void legacyImageUpload(ValueCallback<Uri> uploadMsg, String acceptType, String capture);
}
}

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_content"
@ -16,24 +15,23 @@
android:theme="@style/AppTheme.AppBarOverlay">
<LinearLayout
android:id="@+id/appbar_linear_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/appbar_linear_layout"
android:orientation="vertical"
android:background="?attr/colorPrimary"
android:orientation="vertical"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/AppTheme.PopupOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/main__topbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/main__topbar"/>
android:layout_height="wrap_content" />
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.design.widget.AppBarLayout>

View file

@ -19,16 +19,16 @@
<TextView
android:id="@+id/fragment_about__app_name"
style="@android:style/TextAppearance.DeviceDefault.Large"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAlignment="center"
android:text="@string/diaspora_for_android"
style="@android:style/TextAppearance.DeviceDefault.Large"/>
android:textAlignment="center" />
<TextView
android:id="@+id/fragment_about__app_version"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragment_about__app_version"/>
android:layout_height="wrap_content" />
<android.support.v4.widget.Space
android:layout_width="match_parent"
@ -36,10 +36,10 @@
<com.github.dfa.diaspora_android.ui.HtmlTextView
android:id="@+id/fragment_about__about_text"
style="@android:style/TextAppearance.DeviceDefault.Small"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/fragment_about__about_content"
style="@android:style/TextAppearance.DeviceDefault.Small"
android:linksClickable="true" />
android:linksClickable="true"
android:text="@string/fragment_about__about_content" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>

View file

@ -20,74 +20,77 @@
<!-- APP SECTION -->
<TextView
android:id="@+id/fragment_debug__section_app"
style="@android:style/TextAppearance.DeviceDefault.Large"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/fragment_debug__section_app"
style="@android:style/TextAppearance.DeviceDefault.Large"/>
android:text="@string/fragment_debug__section_app" />
<TextView
android:id="@+id/fragment_debug__package_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragment_debug__package_name"/>
android:layout_height="wrap_content" />
<TextView
android:id="@+id/fragment_debug__app_version"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragment_debug__app_version"/>
android:layout_height="wrap_content" />
<!-- DEVICE SECTION -->
<TextView
android:id="@+id/fragment_debug__section_device"
style="@android:style/TextAppearance.DeviceDefault.Large"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/fragment_debug__section_device"
android:paddingTop="@dimen/activity_vertical_margin"
style="@android:style/TextAppearance.DeviceDefault.Large"/>
android:text="@string/fragment_debug__section_device" />
<TextView
android:id="@+id/fragment_debug__android_version"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragment_debug__android_version"/>
android:layout_height="wrap_content" />
<TextView
android:id="@+id/fragment_debug__device_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragment_debug__device_name"/>
android:layout_height="wrap_content" />
<!-- POD SECTION -->
<TextView
android:id="@+id/fragment_debug__section_pod"
style="@android:style/TextAppearance.DeviceDefault.Large"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/fragment_debug__section_pod"
android:paddingTop="@dimen/activity_vertical_margin"
style="@android:style/TextAppearance.DeviceDefault.Large"/>
android:text="@string/fragment_debug__section_pod" />
<TextView
android:id="@+id/fragment_debug__pod_domain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragment_debug__pod_domain"/>
android:layout_height="wrap_content" />
<!-- LOG SECTION -->
<TextView
android:id="@+id/fragment_debug__section_log"
style="@android:style/TextAppearance.DeviceDefault.Large"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/fragment_debug__section_log"
android:paddingTop="@dimen/activity_vertical_margin"
style="@android:style/TextAppearance.DeviceDefault.Large"/>
android:text="@string/fragment_debug__section_log" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/fragment_debug__log_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:longClickable="true"
android:id="@+id/fragment_debug__log_box" />
android:longClickable="true" />
</HorizontalScrollView>
</ScrollView>
</LinearLayout>

View file

@ -16,32 +16,33 @@
<android.support.v4.widget.Space
android:layout_width="match_parent"
android:layout_height="@dimen/activity_vertical_margin" />
<TextView
style="@android:style/TextAppearance.DeviceDefault.Large"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/fragment_license__copyright_years"
style="@android:style/TextAppearance.DeviceDefault.Large"/>
android:text="@string/fragment_license__copyright_years" />
<com.github.dfa.diaspora_android.ui.HtmlTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragment_license__licensetext"
android:text="@string/fragment_license__license_content"
style="@android:style/TextAppearance.DeviceDefault.Small"
android:linksClickable="true" />
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:linksClickable="true"
android:text="@string/fragment_license__license_content" />
<TextView
style="@android:style/TextAppearance.DeviceDefault.Large"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/fragment_license__3rd_party_libs_title"
android:paddingTop="@dimen/activity_vertical_margin"
style="@android:style/TextAppearance.DeviceDefault.Large"/>
android:text="@string/fragment_license__3rd_party_libs_title" />
<com.github.dfa.diaspora_android.ui.HtmlTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragment_license__3rdparty"
style="@android:style/TextAppearance.DeviceDefault.Small"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:linksClickable="true" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

View file

@ -1,35 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/color_picker_dialog__title_background"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/color_picker_dialog__title"
android:layout_margin="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.AppCompat.Large.Inverse"
/>
android:layout_margin="20dp"
android:textAppearance="@style/TextAppearance.AppCompat.Large.Inverse" />
</FrameLayout>
<uz.shift.colorpicker.LineColorPicker
android:id="@+id/color_picker_dialog__base_picker"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginTop="20dp"
android:layout_margin="10dp"
android:layout_marginTop="20dp"
app:orientation="horizontal" />
<uz.shift.colorpicker.LineColorPicker
android:id="@+id/color_picker_dialog__shade_picker"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="30dp"
android:layout_margin="10dp"
android:layout_marginBottom="10dp"
android:layout_marginTop="30dp"
app:orientation="horizontal" />
</LinearLayout>

View file

@ -1,20 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
android:layout_height="match_parent">
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/fragment_followed_tags__recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<!-- Offset -->

View file

@ -19,10 +19,10 @@
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:itemTextColor="@color/primary_text"
app:paddingEnd="0dp"
app:paddingStart="0dp"
app:headerLayout="@layout/main__nav_header"
app:menu="@menu/main__navdrawer" />
app:itemTextColor="@color/primary_text"
app:menu="@menu/main__navdrawer"
app:paddingEnd="0dp"
app:paddingStart="0dp" />
</android.support.v4.widget.DrawerLayout>

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"

View file

@ -3,9 +3,9 @@
android:id="@+id/nav_drawer"
android:layout_width="wrap_content"
android:layout_height="110dp"
android:background="@color/colorPrimary"
android:gravity="bottom"
android:orientation="vertical"
android:background="@color/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<!--

View file

@ -0,0 +1,121 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:scrollbars="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/podselection__dialog__text_profile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/activity_vertical_margin"
android:text="@string/profile"
android:textAppearance="@style/AppTheme.TextAppearance.Caption"
android:visibility="gone" />
<Spinner
android:id="@+id/podselection__dialog__spinner_profile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_horizontal_margin_half"
android:visibility="gone" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/activity_horizontal_margin_half"
android:text="@string/pod_name"
android:textAppearance="@style/AppTheme.TextAppearance.Caption" />
<EditText
android:id="@+id/podselection__dialog__edit_podname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_horizontal_margin_half"
android:ems="10"
android:hint="@string/pod_name"
android:inputType="textPersonName"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
tools:text="Geraspora" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/activity_horizontal_margin_half"
android:text="@string/pod_address"
android:textAppearance="@style/AppTheme.TextAppearance.Caption" />
<EditText
android:id="@+id/podselection__dialog__edit_podaddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_horizontal_margin_half"
android:ems="10"
android:hint="@string/pod_address"
android:inputType="textPersonName"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
tools:text="pod.geraspora.de" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/activity_horizontal_margin_half"
android:text="@string/http_protocol"
android:textAppearance="@style/AppTheme.TextAppearance.Caption" />
<RadioGroup
android:id="@+id/podselection__dialog__radiogroup_protocol"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_horizontal_margin_half"
android:checkedButton="@+id/podselection__dialog__radio_https"
android:orientation="horizontal">
<RadioButton
android:id="@+id/podselection__dialog__radio_http"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="http" />
<RadioButton
android:id="@+id/podselection__dialog__radio_https"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="https" />
</RadioGroup>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:id="@+id/podselection__dialog__btn_cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@android:string/cancel" />
<Button
android:id="@+id/podselection__dialog__btn_ok"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@android:string/ok" />
</LinearLayout>
</LinearLayout>
</ScrollView>

View file

@ -4,62 +4,29 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/podselection__fragment">
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<ListView
android:id="@+id/podselection__listpods"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/podselection__podupti_notice"
android:layout_below="@+id/podselection__edit_filter"
android:choiceMode="singleChoice" />
<EditText
android:id="@+id/podselection__edit_filter"
<Button
android:id="@+id/podselection__fragment__button_use_custom_pod"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toEndOf="@+id/textView"
android:layout_toStartOf="@+id/podselection__button_select_pod"
android:hint="@string/filter_hint"
android:inputType="textUri|textWebEditText" />
android:text="@string/podselection__custom_pod"
tools:text="Benutzerdefinierter Pod" />
<ImageView
android:id="@+id/podselection__button_select_pod"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/podselection__listpods"
android:layout_alignEnd="@+id/podselection__listpods"
android:layout_alignTop="@+id/podselection__edit_filter"
android:contentDescription="@string/confirm_url"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:src="@drawable/ic_arrow_forward_black_48px" />
<TextView
android:id="@+id/podselection__podupti_notice"
<ListView
android:id="@+id/podselection__fragment__listpods"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:autoLink="web"
android:text="@string/podlist_source_note"
android:textAppearance="?android:attr/textAppearanceSmall" />
android:layout_below="@+id/podselection__fragment__button_use_custom_pod"
android:choiceMode="singleChoice" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/podselection__listpods"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginEnd="0dp"
android:gravity="center_vertical"
android:text="@string/prefix_https"
android:textAppearance="?android:attr/textAppearanceMedium" />
</RelativeLayout>

View file

@ -1,23 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/recycler_view__list_item__root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<View
android:id="@+id/recycler_view__list_item__divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/divider" />
<TextView
android:id="@+id/recycler_view__list_item__text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginEnd="@dimen/activity_horizontal_margin"
android:layout_marginTop="12dp"
android:layout_marginBottom="12dp"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/divider"/>
android:layout_marginEnd="@dimen/activity_horizontal_margin"
android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginTop="12dp"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="@color/primary_text"
tools:text="Very much text" />
</LinearLayout>

View file

@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.AppBarLayout
android:id="@+id/settings__appbar"
android:layout_width="match_parent"

View file

@ -1,14 +1,16 @@
<?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" android:layout_gravity="center_horizontal"
android:paddingStart="@dimen/activity_horizontal_margin_half" android:paddingEnd="@dimen/activity_horizontal_margin_half">
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:orientation="vertical"
android:paddingEnd="@dimen/activity_horizontal_margin_half"
android:paddingStart="@dimen/activity_horizontal_margin_half">
<EditText
android:id="@+id/dialog_search__input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:hint="@string/app_hashtag"
/>
android:maxLines="1" />
</LinearLayout>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="none">
<group android:checkableBehavior="none" android:id="@+id/nav_group__pod">
<item
android:id="@+id/nav_stream"
android:icon="@drawable/ic_stream"

View file

@ -1,6 +1,13 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/podselection__action_search"
android:icon="@drawable/ic_search_white_48px"
android:title="@string/search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always|collapseActionView" />
<item
android:id="@+id/action_reload"
android:icon="@drawable/ic_refresh_white_48px"

File diff suppressed because it is too large Load diff

View file

@ -2,12 +2,14 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Font size -->
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
<!-- Load images -->

View file

@ -2,6 +2,7 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
@ -15,12 +16,6 @@
<string name="pref_desc__sub_nav_slider">Konfiguration der Sichtbarkeit von Einträgen im Navigation-Slider</string>
<string name="pref_cat__visibility_nav_items">Sichtbarkeit der Einträge</string>
<!-- Themes -->
<string name="pref_title__themes">Farbschema</string>
<string name="pref_desc__themes">Einstellungen des Farbdesigns</string>
<string name="pref_title__primary_color">Primärfarbe</string>
<string name="pref_desc__primary_color">Färbung der Werkzeugleisten</string>
<string name="pref_title__accent_color">Akzentfarbe</string>
<string name="pref_desc__accent_color">Färbung der Details</string>
<!-- Font size -->
<string name="pref_title__font_size">Schriftgröße</string>
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
@ -30,9 +25,6 @@
<!-- Proxy -->
<string name="pref_title__sub_proxy">Proxy</string>
<string name="pref_title__proxy_enabled">Aktiviere Netzwerkproxy</string>
<string name="pref_desc__http_proxy_enabled">Nutze einen Proxyserver, um Firewalls zu umgehen</string>
<string name="pref_title__http_proxy_host">Host</string>
<string name="pref_title__http_proxy_port">Port</string>
<!-- Chrome custom tabs -->
<string name="pref_title__chrome_custom_tabs_enabled">Chrome Custom Tabs</string>
<string name="pref_desc__chrome_custom_tabs_enabled">Externe Links mit Chrome Custom Tabs öffnen. Chromium oder Google Chrome muss für dieses Feature installiert sein.\nWICHTIGER HINWEIS: Chrome Custom Tabs verwenden die konfigurierten Proxy-Server nicht!</string>

View file

@ -2,12 +2,14 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Font size -->
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
<!-- Load images -->

View file

@ -2,6 +2,7 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
@ -14,6 +15,7 @@
<string name="pref_title__sub_nav_slider">Control deslizante de navegación</string>
<string name="pref_desc__sub_nav_slider">Control de visibilidad de las entradas en el cajón de navegación</string>
<string name="pref_cat__visibility_nav_items">Elemento visibilidad</string>
<!-- Themes -->
<!-- Font size -->
<string name="pref_title__font_size">Tamaño de letra</string>
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
@ -22,9 +24,6 @@
<string name="pref_desc__load_images">Desactivar la carga de de imágenes a datos móviles seguros</string>
<!-- Proxy -->
<string name="pref_title__proxy_enabled">Activar Proxy</string>
<string name="pref_desc__http_proxy_enabled">El tráfico proxificado de Diaspora para evitar firewalls.\nPuede necesitar reiniciarse</string>
<string name="pref_title__http_proxy_host">Anfitrión</string>
<string name="pref_title__http_proxy_port">Puerto</string>
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<string name="pref_title__personal_settings">Configuración personal</string>

View file

@ -2,6 +2,7 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
@ -14,6 +15,7 @@
<string name="pref_title__sub_nav_slider">Barre de défilement</string>
<string name="pref_desc__sub_nav_slider">Contrôles de la visibilité des entrées dans le volet de navigation</string>
<string name="pref_cat__visibility_nav_items">Visibilité de lélément</string>
<!-- Themes -->
<!-- Font size -->
<string name="pref_title__font_size">Taille de la police</string>
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
@ -21,13 +23,16 @@
<string name="pref_title__load_images">Charger les images</string>
<string name="pref_desc__load_images">Désactiver le chargements des images pour préserver la data mobile</string>
<!-- Proxy -->
<string name="pref_title__http_proxy_load_tor_preset">Charger la pré-configuration Tor</string>
<string name="pref_desc__http_proxy_load_tor_preset">Charger les paramètres proxy pour Tor (Orbot) HTTP Proxy</string>
<string name="pref_title__sub_proxy">Proxy</string>
<string name="pref_title__proxy_enabled">Activer Proxy</string>
<string name="pref_desc__http_proxy_enabled">Serveur Proxy.\n(Nécessite un redémarrage)</string>
<string name="pref_desc__http_proxy_enabled">Proxy pour diaspora pour contourner les pare-feux.\nPeut nécessiter un redémarrage</string>
<string name="pref_title__http_proxy_host">Hôte</string>
<string name="pref_title__http_proxy_port">Port</string>
<!-- Chrome custom tabs -->
<string name="pref_title__chrome_custom_tabs_enabled">Onglets personnalisés de Chrome</string>
<string name="pref_desc__chrome_custom_tabs_enabled">Ouvrir les liens externes avec les onglets personnalisés de Chrome. Chomium ou Google Chrome doit être installé pour cette fonctionnalité. \nNOTE IMPORTANTE : les onglets personnalisés de Chrome n\'utilisent pas les serveurs proxy configurés !</string>
<!-- Diaspora Settings -->
<string name="pref_title__personal_settings">Paramètres personnels</string>
<string name="pref_desc__personal_settings">Ouvrir vos paramètres de compte diaspora</string>

View file

@ -2,12 +2,14 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Font size -->
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
<!-- Load images -->

View file

@ -2,12 +2,14 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Font size -->
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
<!-- Load images -->

View file

@ -2,6 +2,7 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
@ -14,6 +15,7 @@
<string name="pref_title__sub_nav_slider">Menù di navigazione</string>
<string name="pref_desc__sub_nav_slider">Controlla la visibilità degli elementi nel menù di navigazione</string>
<string name="pref_cat__visibility_nav_items">Visibilità degli elementi</string>
<!-- Themes -->
<!-- Font size -->
<string name="pref_title__font_size">Dimensione font</string>
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
@ -23,11 +25,11 @@
<!-- Proxy -->
<string name="pref_title__sub_proxy">Proxy</string>
<string name="pref_title__proxy_enabled">Attiva proxy</string>
<string name="pref_desc__http_proxy_enabled">Traffico del proxy di Diaspora per bypassare i firewall.\nPuò essere necessario il riavvio dell\'app</string>
<string name="pref_title__http_proxy_host">Host</string>
<string name="pref_title__http_proxy_port">Porta</string>
<!-- Chrome custom tabs -->
<string name="pref_title__chrome_custom_tabs_enabled">Schede personalizzate di Chrome</string>
<string name="pref_desc__chrome_custom_tabs_enabled">Apri collegamenti esterni con le schede personalizzate di Chrome. Chromium o Google Chrome devono essere installati per questa funzione. \nNOTA IMPORTANTE: le schede personalizzate di Chrome non usano i server proxy configurabili!</string>
<!-- Diaspora Settings -->
<string name="pref_title__personal_settings">Impostazioni personali</string>
<string name="pref_desc__personal_settings">Apri le impostazioni del tuo account Diaspora</string>

View file

@ -2,6 +2,7 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
@ -14,6 +15,7 @@
<string name="pref_title__sub_nav_slider">ナビゲーション スライダー</string>
<string name="pref_desc__sub_nav_slider">ナビゲーションドロワー内のエントリーの表示を制御します</string>
<string name="pref_cat__visibility_nav_items">アイテムの表示</string>
<!-- Themes -->
<!-- Font size -->
<string name="pref_title__font_size">フォントサイズ</string>
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
@ -21,6 +23,8 @@
<string name="pref_title__load_images">画像の読み込み</string>
<string name="pref_desc__load_images">安全なモバイルデータのため、画像の読み込みを無効にします</string>
<!-- Proxy -->
<string name="pref_title__http_proxy_load_tor_preset">Tor プリセットを読み込む</string>
<string name="pref_desc__http_proxy_load_tor_preset">Tor (Orbot) HTTP プロキシのプロキシ設定を読み込みます</string>
<string name="pref_title__sub_proxy">プロキシ</string>
<string name="pref_title__proxy_enabled">プロキシを有効にする</string>
<string name="pref_desc__http_proxy_enabled">Diaspora の通信をプロキシして、ファイアウォールに回避します。\n再起動が必要になることがあります</string>
@ -28,6 +32,7 @@
<string name="pref_title__http_proxy_port">ポート</string>
<!-- Chrome custom tabs -->
<string name="pref_title__chrome_custom_tabs_enabled">Chrome カスタムタブ</string>
<string name="pref_desc__chrome_custom_tabs_enabled">Chrome のカスタム タブで外部リンクを開きます。この機能は Chromium または Google Chrome をインストールする必要があります。\n重要な注意: Chrome のカスタム タブは構成されているプロキシ サーバーを使用しません!</string>
<!-- Diaspora Settings -->
<string name="pref_title__personal_settings">個人用設定</string>
<string name="pref_desc__personal_settings">Diaspora アカウント設定を開きます</string>

View file

@ -2,12 +2,14 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Font size -->
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
<!-- Load images -->

View file

@ -2,6 +2,7 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
@ -14,6 +15,7 @@
<string name="pref_title__sub_nav_slider">നാവിഗേഷൻ സ്ലൈഡർ</string>
<string name="pref_desc__sub_nav_slider">നാവിഗേഷൻ ഡ്രാവറിൽ കാണേണ്ട എൻട്രികൾ നിയന്ത്രിക്കൂ</string>
<string name="pref_cat__visibility_nav_items">ഇനത്തിന്റെ കാഴ്ച</string>
<!-- Themes -->
<!-- Font size -->
<string name="pref_title__font_size">ഫോണ്ട് സൈസ്</string>
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
@ -22,9 +24,6 @@
<string name="pref_desc__load_images">മൊബൈൽ ഡാറ്റ ഉപഭോഗം കുറയ്ക്കാനായി ചിത്രങ്ങൾ ലോഡ് ചെയ്യാതിരിക്കുക</string>
<!-- Proxy -->
<string name="pref_title__proxy_enabled">പ്രോക്സി അനുവദിക്കൂ</string>
<string name="pref_desc__http_proxy_enabled">ഫയർവാളുകളെ മറികടക്കാൻ ഡയസ്പോറ ട്രാഫിക് പ്രോക്സി ചെയ്യൂ.\nപുനരാരഭിക്കേണ്ടി വന്നേക്കാം</string>
<string name="pref_title__http_proxy_host">ആഥിതേയൻ</string>
<string name="pref_title__http_proxy_port">പോർട്ട്</string>
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<string name="pref_title__personal_settings">സ്വകാര്യ സജ്ജീകരണങ്ങൾ</string>

View file

@ -2,6 +2,7 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
@ -13,6 +14,7 @@
<!-- Navigiation Slider -->
<string name="pref_title__sub_nav_slider">Navigatie Slider</string>
<string name="pref_cat__visibility_nav_items">Item Zichtbaarheid</string>
<!-- Themes -->
<!-- Font size -->
<string name="pref_title__font_size">Lettergrootte</string>
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
@ -21,9 +23,6 @@
<string name="pref_desc__load_images">Afbeelding laden uitschakelen om mobiele data te besparen</string>
<!-- Proxy -->
<string name="pref_title__proxy_enabled">Proxy inschakelen</string>
<string name="pref_desc__http_proxy_enabled">Gebruik een Proxy voor Diaspora om de firewalls te omzeilen.\nRestart nodig</string>
<string name="pref_title__http_proxy_host">Host</string>
<string name="pref_title__http_proxy_port">Poort</string>
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<string name="pref_title__personal_settings">Persoonlijke instellingen</string>

View file

@ -2,12 +2,14 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Font size -->
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
<!-- Load images -->

View file

@ -2,6 +2,7 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
@ -11,6 +12,7 @@
<string name="pref_cat__pod_settings">Ustawienia poda</string>
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Font size -->
<string name="pref_title__font_size">Rozmiar czcionki</string>
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->

View file

@ -2,6 +2,7 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
@ -14,6 +15,7 @@
<string name="pref_title__sub_nav_slider">Controle deslizante de navegação</string>
<string name="pref_desc__sub_nav_slider">Visibilidade do controle de entradas na gaveta de navegação</string>
<string name="pref_cat__visibility_nav_items">Visibilidade de item</string>
<!-- Themes -->
<!-- Font size -->
<string name="pref_title__font_size">Tamanho da fonte</string>
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
@ -22,9 +24,6 @@
<string name="pref_desc__load_images">Desabilitar o carregamento de imagens para economizar seus créditos</string>
<!-- Proxy -->
<string name="pref_title__proxy_enabled">Habilitar o Proxy</string>
<string name="pref_desc__http_proxy_enabled">Usar proxy para o tráfego da diáspora para contornar firewalls.\nPode requerer reinicialização</string>
<string name="pref_title__http_proxy_host">Servidor</string>
<string name="pref_title__http_proxy_port">Porta</string>
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<string name="pref_title__personal_settings">Configurações pessoais</string>

View file

@ -2,12 +2,14 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Font size -->
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
<!-- Load images -->

View file

@ -2,6 +2,7 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
@ -14,6 +15,7 @@
<string name="pref_title__sub_nav_slider">Слайдер навигации</string>
<string name="pref_desc__sub_nav_slider">Управление видимостью записей в ящике навигации</string>
<string name="pref_cat__visibility_nav_items">Видимость элемента</string>
<!-- Themes -->
<!-- Font size -->
<string name="pref_title__font_size">Размер шрифта</string>
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
@ -22,9 +24,6 @@
<string name="pref_desc__load_images">Отключить загрузку изображений для экономии траффика</string>
<!-- Proxy -->
<string name="pref_title__proxy_enabled">Использовать прокси</string>
<string name="pref_desc__http_proxy_enabled">Перенаправить трафик Диаспоры в обход брандмауэров.\nМожет потребовать перезапуска</string>
<string name="pref_title__http_proxy_host">Хост</string>
<string name="pref_title__http_proxy_port">Порт</string>
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<string name="pref_title__personal_settings">Личные настройки</string>

View file

@ -2,12 +2,14 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Font size -->
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
<!-- Load images -->

View file

@ -2,12 +2,14 @@
<!--Generated by crowdin.com-->
<resources>
<!-- Key Names (Untranslatable) -->
<!-- Themes -->
<!-- Navigiation Slider -->
<!-- PodProfile -->
<!-- More -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Font size -->
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
<!-- Load images -->

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Key Names (Untranslatable) -->
<string name="pref_key__poddomain" translatable="false">podDomain</string>
<string name="pref_key__previous_podlist" translatable="false">previousPodlist</string>
<string name="pref_key__poddomain_legacy" translatable="false">podDomain</string>
<string name="pref_key__current_pod_0" translatable="false">pref_key__current_pod_0</string>
<string name="pref_key__font_size" translatable="false">pref_key_font_size</string>
<string name="pref_key__intellihide_toolbars" translatable="false">pref_key_intellihide_toolbars</string>
<string name="pref_catkey__pod_settings" translatable="false">pref_key_category_pod_settings</string>

View file

@ -34,6 +34,7 @@
<string name="title_activity_pods">Select Pod</string>
<string name="filter_hint">Enter pod domain</string>
<string name="confirm_url">Confirm pod url</string>
<string name="search_for_pod">Search for Pod…</string>
<string name="podlist_source_note">Note: The podlist is populated by secure pods listed on https://podupti.me. You can enter in the edit field any pod not listed.</string>
<string name="valid_pod">Please enter a valid domain name</string>
<string name="podlist_error">Error: Could not retrieve list of pods!</string>
@ -103,4 +104,9 @@
Diaspora. In the permissions section you can grant the \"write storage permission\".</string>
<string name="permission_denied">Permission denied.</string>
<string name="permission_granted_try_again">Permission granted. Please try again.</string>
<string name="podselection__custom_pod">Custom Pod</string>
<string name="pod_name">Pod name</string>
<string name="http_protocol">Protocol</string>
<string name="pod_address">Pod address</string>
<string name="missing_value">Missing value</string>
</resources>

View file

@ -30,4 +30,8 @@
<item name="android:background">@color/white</item>
</style>
<style name="AppTheme.TextAppearance.Caption" parent="TextAppearance.AppCompat.Caption">
<item name="android:textColor">@color/accent</item>
</style>
</resources>