Skip to content

Commit

Permalink
Correct ActionBar subtitle on locale change
Browse files Browse the repository at this point in the history
  • Loading branch information
jberkel committed Apr 18, 2018
1 parent a26a62e commit 70c9e68
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 8 deletions.
21 changes: 13 additions & 8 deletions app/src/main/java/com/zegoggles/smssync/activity/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import android.provider.Telephony.Sms;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
Expand Down Expand Up @@ -116,13 +117,14 @@ public class MainActivity extends ThemeActivity implements
private static final int REQUEST_PERMISSIONS_BACKUP_SERVICE = 6;

public static final String EXTRA_PERMISSIONS = "permissions";
private static final String SCREEN_TITLE = "title";
private static final String SCREEN_TITLE_RES = "titleRes";

private Preferences preferences;
private AuthPreferences authPreferences;
private OAuth2Client oauth2Client;
private Intent fallbackAuthIntent;
private Intent changeDefaultPackageIntent;
private PreferenceTitles preferenceTitles;

@Override
public void onCreate(Bundle bundle) {
Expand All @@ -136,7 +138,7 @@ public void onCreate(Bundle bundle) {
oauth2Client = new OAuth2Client(authPreferences.getOAuth2ClientId());
fallbackAuthIntent = new Intent(this, OAuth2WebAuthActivity.class).setData(oauth2Client.requestUrl());
changeDefaultPackageIntent = new Intent(ACTION_CHANGE_DEFAULT).putExtra(EXTRA_PACKAGE_NAME, getPackageName());

preferenceTitles = new PreferenceTitles(getResources(), R.xml.preferences);
preferences = new Preferences(this);
if (bundle == null) {
showFragment(new MainSettings(), null);
Expand Down Expand Up @@ -237,8 +239,11 @@ public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Prefer
if (LOCAL_LOGV) {
Log.v(TAG, "onPreferenceStartFragment(" + preference + ")");
}
final Fragment fragment = Fragment.instantiate(this, preference.getFragment(),
new BundleBuilder().putString(SCREEN_TITLE, String.valueOf(preference.getTitle())).build());
final Fragment fragment = Fragment.instantiate(
this,
preference.getFragment(),
new BundleBuilder().putInt(SCREEN_TITLE_RES, preferenceTitles.getTitleRes(preference.getKey())).build());

showFragment(fragment, preference.getKey());
return true;
}
Expand Down Expand Up @@ -318,13 +323,13 @@ public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, Preferen
onBackStackChanged();
}

private @Nullable CharSequence getCurrentTitle() {
private @StringRes int getCurrentTitle() {
final int entryCount = getSupportFragmentManager().getBackStackEntryCount();
if (entryCount == 0) {
return null;
return 0;
} else {
final BackStackEntry entry = getSupportFragmentManager().getBackStackEntryAt(entryCount - 1);
return entry.getBreadCrumbTitle();
return entry.getBreadCrumbTitleRes();
}
}

Expand Down Expand Up @@ -409,7 +414,7 @@ private void showFragment(@NonNull Fragment fragment, @Nullable String rootKey)
.replace(R.id.preferences_container, fragment, rootKey);
if (rootKey != null) {
tx.addToBackStack(null);
tx.setBreadCrumbTitle(args.getString(SCREEN_TITLE));
tx.setBreadCrumbTitle(args.getInt(SCREEN_TITLE_RES));
}
tx.commit();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.zegoggles.smssync.activity;

import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.annotation.XmlRes;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
* Standard Android preferences don't expose the title resource id. Reparse preferences XML,
* key title resources by preference key.
*/
class PreferenceTitles {
private static final String NS = "http://schemas.android.com/apk/res/android";
private static final String PREFERENCE_SCREEN = "PreferenceScreen";
private Map<String, Integer> titleResources = new HashMap<String, Integer>();

PreferenceTitles(@NonNull Resources resources, @XmlRes int preferenceRes) {
final XmlResourceParser parser = resources.getXml(preferenceRes);
try {
while (true) {
int type;
do {
type = parser.next();
} while (type != XmlPullParser.START_TAG && type != XmlPullParser.END_DOCUMENT);

if (type == XmlPullParser.END_DOCUMENT) {
break;
} else if (PREFERENCE_SCREEN.equals(parser.getName()) && parser.getAttributeCount() > 0) {
final @StringRes int titleRes = parser.getAttributeResourceValue(NS, "title", 0);
final String key = parser.getAttributeValue(NS, "key");
if (titleRes > 0 && key != null) {
titleResources.put(key, titleRes);
}
}
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (XmlPullParserException e) {
throw new RuntimeException(e);
}
}

/**
* @return the string resource id or 0 if not found
*/
@StringRes int getTitleRes(String preferenceKey) {
final Integer res = titleResources.get(preferenceKey);
return res == null ? 0 : res;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.zegoggles.smssync.activity;

import com.zegoggles.smssync.R;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;

import static com.google.common.truth.Truth.assertThat;

@RunWith(RobolectricTestRunner.class)
public class PreferenceTitlesTest {
private PreferenceTitles subject;

@Before
public void setUp() throws Exception {
subject = new PreferenceTitles(RuntimeEnvironment.application.getResources(), R.xml.preferences);
}

@Test public void testParseValidKey() {
final int res = subject.getTitleRes("com.zegoggles.smssync.activity.fragments.AutoBackupSettings");
assertThat(res).isGreaterThan(0);
String resolved = RuntimeEnvironment.application.getString(res);
assertThat(resolved).isEqualTo("Auto backup settings");
}

@Test public void testInvalidKeyReturnsZero() {
final int res = subject.getTitleRes("foo.bar.not.found");
assertThat(res).isEqualTo(0);
}
}

0 comments on commit 70c9e68

Please sign in to comment.