add not-again hint when dark-theme used

This commit is contained in:
Eric House 2021-08-13 13:47:54 -07:00
parent a8abdaad8c
commit 2e6572f250
7 changed files with 123 additions and 35 deletions

View file

@ -55,10 +55,13 @@ import java.util.Set;
import org.eehouse.android.xw4.DBUtils.SentInvitesInfo; import org.eehouse.android.xw4.DBUtils.SentInvitesInfo;
import org.eehouse.android.xw4.DlgDelegate.Action; import org.eehouse.android.xw4.DlgDelegate.Action;
import org.eehouse.android.xw4.DlgDelegate.ActionPair; import org.eehouse.android.xw4.DlgDelegate.ActionPair;
import org.eehouse.android.xw4.NFCUtils.Wrapper;
import org.eehouse.android.xw4.Perms23.Perm; import org.eehouse.android.xw4.Perms23.Perm;
import org.eehouse.android.xw4.TilePickAlert.TilePickState;
import org.eehouse.android.xw4.Toolbar.Buttons; import org.eehouse.android.xw4.Toolbar.Buttons;
import org.eehouse.android.xw4.jni.CommonPrefs; import org.eehouse.android.xw4.gen.PrefsWrappers;
import org.eehouse.android.xw4.jni.CommonPrefs.TileValueType; import org.eehouse.android.xw4.jni.CommonPrefs.TileValueType;
import org.eehouse.android.xw4.jni.CommonPrefs;
import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnType; import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnType;
import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnTypeSet; import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnTypeSet;
import org.eehouse.android.xw4.jni.CommsAddrRec; import org.eehouse.android.xw4.jni.CommsAddrRec;
@ -77,8 +80,6 @@ import org.eehouse.android.xw4.jni.UtilCtxtImpl;
import org.eehouse.android.xw4.jni.XwJNI.GamePtr; import org.eehouse.android.xw4.jni.XwJNI.GamePtr;
import org.eehouse.android.xw4.jni.XwJNI; import org.eehouse.android.xw4.jni.XwJNI;
import org.eehouse.android.xw4.loc.LocUtils; import org.eehouse.android.xw4.loc.LocUtils;
import org.eehouse.android.xw4.TilePickAlert.TilePickState;
import org.eehouse.android.xw4.NFCUtils.Wrapper;
public class BoardDelegate extends DelegateBase public class BoardDelegate extends DelegateBase
implements TransportProcs.TPMsgHandler, View.OnClickListener, implements TransportProcs.TPMsgHandler, View.OnClickListener,
@ -538,6 +539,25 @@ public class BoardDelegate extends DelegateBase
} else { } else {
m_startSkipped = true; m_startSkipped = true;
} }
newThemeFeatureAlert();
}
private static boolean s_themeNAShown = false;
private void newThemeFeatureAlert()
{
if ( ! s_themeNAShown ) {
s_themeNAShown = true;
if ( CommonPrefs.darkThemeEnabled( m_activity ) ) {
String prefsName = LocUtils.getString( m_activity, R.string.theme_which );
String msg = LocUtils
.getString( m_activity, R.string.not_again_boardThemes_fmt,
prefsName );
makeNotAgainBuilder( msg, R.string.key_na_boardThemes )
.setTitle( R.string. new_feature_title )
.setActionPair( Action.LAUNCH_THEME_CONFIG, R.string.button_settings )
.show();
}
}
} }
@Override @Override
@ -1134,6 +1154,10 @@ public class BoardDelegate extends DelegateBase
} }
break; break;
case LAUNCH_THEME_CONFIG:
PrefsDelegate.launch( m_activity, PrefsWrappers.prefs_appear_themes.class );
break;
case ENABLE_NBS_DO: case ENABLE_NBS_DO:
post( new Runnable() { post( new Runnable() {
@Override @Override

View file

@ -55,6 +55,7 @@ public class DlgDelegate {
QUARANTINE_CLEAR, QUARANTINE_CLEAR,
QUARANTINE_DELETE, QUARANTINE_DELETE,
APPLY_CONFIG, APPLY_CONFIG,
LAUNCH_THEME_CONFIG,
// BoardDelegate // BoardDelegate
UNDO_LAST_ACTION, UNDO_LAST_ACTION,

View file

@ -49,6 +49,7 @@ public class PrefsActivity extends XWActivity
OnPreferenceStartFragmentCallback, OnPreferenceStartFragmentCallback,
OnPreferenceDisplayDialogCallback { OnPreferenceDisplayDialogCallback {
private final static String TAG = PrefsActivity.class.getSimpleName(); private final static String TAG = PrefsActivity.class.getSimpleName();
private static final String CLASS_NAME = "CLASS_NAME";
private PrefsDelegate m_dlgt; private PrefsDelegate m_dlgt;
@ -66,7 +67,17 @@ public class PrefsActivity extends XWActivity
Assert.assertTrue( 0 < layoutID ); Assert.assertTrue( 0 < layoutID );
m_dlgt.setContentView( layoutID ); m_dlgt.setContentView( layoutID );
PreferenceFragmentCompat rootFrag = new PrefsWrappers.prefs(); PreferenceFragmentCompat rootFrag;
try {
String rootName = getIntent().getExtras().getString( CLASS_NAME );
Assert.assertTrueNR( null != rootName );
Class clazz = Class.forName( rootName );
rootFrag = (PreferenceFragmentCompat)clazz.newInstance();
} catch ( Exception ex ) {
Log.ex( TAG, ex );
rootFrag = new PrefsWrappers.prefs();
Assert.failDbg();
}
m_dlgt.setRootFragment( rootFrag ); m_dlgt.setRootFragment( rootFrag );
getSupportFragmentManager() getSupportFragmentManager()
@ -208,4 +219,12 @@ public class PrefsActivity extends XWActivity
public abstract int getResID(); public abstract int getResID();
} }
public static void bundleRoot( Class root, Intent intent )
{
Assert.assertTrueNR( null == intent.getExtras() );
Bundle bundle = new Bundle();
bundle.putCharSequence( CLASS_NAME, root.getName() );
intent.putExtras( bundle );
}
} }

View file

@ -338,7 +338,7 @@ public class PrefsDelegate extends DelegateBase
// Now replace this activity with a new copy // Now replace this activity with a new copy
// so the new values get loaded. // so the new values get loaded.
PrefsDelegate.launch( mActivity ); launch( mActivity );
finish(); finish();
} }
@ -349,7 +349,16 @@ public class PrefsDelegate extends DelegateBase
public static void launch( Context context ) public static void launch( Context context )
{ {
launch( context, PrefsWrappers.prefs.class );
}
public static void launch( Context context, Class root )
{
Bundle bundle = null;
Intent intent = new Intent( context, PrefsActivity.class ); Intent intent = new Intent( context, PrefsActivity.class );
if ( null != root ) {
PrefsActivity.bundleRoot( root, intent );
}
context.startActivity( intent ); context.startActivity( intent );
} }

View file

@ -105,36 +105,8 @@ public class CommonPrefs extends XWPrefs {
int ord = getInt(context, sp, R.string.key_tile_valuetype, 0); int ord = getInt(context, sp, R.string.key_tile_valuetype, 0);
tvType = TileValueType.values()[ord]; tvType = TileValueType.values()[ord];
Resources res = context.getResources(); ColorTheme theme = getTheme( context, null );
ColorTheme theme = ColorTheme.LIGHT; String[] colorStrIds = context.getResources().getStringArray( theme.getArrayID() );
String which = LocUtils.getString( context, R.string.key_theme_which );
which = sp.getString( which, null );
if ( null != which ) {
try {
switch ( Integer.parseInt( which ) ) {
case 0:
// do nothing
break;
case 1:
theme = ColorTheme.DARK;
break;
case 2:
int uiMode = res.getConfiguration().uiMode;
if ( Configuration.UI_MODE_NIGHT_YES
== (uiMode & Configuration.UI_MODE_NIGHT_MASK) ) {
theme = ColorTheme.DARK;
}
break;
default:
Assert.failDbg();
}
} catch ( Exception ex ) {
// Will happen with old not-an-int saved value
Log.ex( TAG, ex );
}
}
String[] colorStrIds = res.getStringArray( theme.getArrayID() );
int offset = copyColors( sp, colorStrIds, 0, playerColors, 0 ); int offset = copyColors( sp, colorStrIds, 0, playerColors, 0 );
offset += copyColors( sp, colorStrIds, offset, bonusColors, 1 ); offset += copyColors( sp, colorStrIds, offset, bonusColors, 1 );
offset += copyColors( sp, colorStrIds, offset, otherColors, 0 ); offset += copyColors( sp, colorStrIds, offset, otherColors, 0 );
@ -180,6 +152,54 @@ public class CommonPrefs extends XWPrefs {
return s_cp.refresh( context ); return s_cp.refresh( context );
} }
// Is the OS-level setting on?
public static boolean darkThemeEnabled( Context context )
{
boolean[] fromOS = {false};
ColorTheme theme = getTheme( context, fromOS );
boolean result = theme == ColorTheme.DARK && fromOS[0];
return result;
}
private static ColorTheme getTheme( Context context, boolean[] fromOSOut )
{
ColorTheme theme = ColorTheme.LIGHT;
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences( context );
String which = LocUtils.getString( context, R.string.key_theme_which );
which = sp.getString( which, null );
if ( null != which ) {
try {
switch ( Integer.parseInt( which ) ) {
case 0:
// do nothing
break;
case 1:
theme = ColorTheme.DARK;
break;
case 2:
Assert.assertTrueNR( Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q );
Resources res = context.getResources();
int uiMode = res.getConfiguration().uiMode;
if ( Configuration.UI_MODE_NIGHT_YES
== (uiMode & Configuration.UI_MODE_NIGHT_MASK) ) {
theme = ColorTheme.DARK;
if ( null != fromOSOut ) {
fromOSOut[0] = true;
}
}
break;
default:
Assert.failDbg();
}
} catch ( Exception ex ) {
// Will happen with old not-an-int saved value
Log.ex( TAG, ex );
}
}
return theme;
}
public static int getDefaultBoardSize( Context context ) public static int getDefaultBoardSize( Context context )
{ {
String value = getPrefsString( context, R.string.key_board_size ); String value = getPrefsString( context, R.string.key_board_size );

View file

@ -180,6 +180,7 @@
<string name="key_na_dupstatus_host">key_na_dupstatus_host</string> <string name="key_na_dupstatus_host">key_na_dupstatus_host</string>
<string name="key_na_dupstatus_guest">key_na_dupstatus_guest</string> <string name="key_na_dupstatus_guest">key_na_dupstatus_guest</string>
<string name="key_na_quicknetgame">key_na_quicknetgame</string> <string name="key_na_quicknetgame">key_na_quicknetgame</string>
<string name="key_na_boardThemes">key_na_boardThemes</string>
<string name="key_theme_which">key_theme_which</string> <string name="key_theme_which">key_theme_which</string>

View file

@ -2771,4 +2771,18 @@
\n\nThis action cannot be undone, but you can always restore the \n\nThis action cannot be undone, but you can always restore the
default colors for this theme.</string> default colors for this theme.</string>
<string name="button_apply_config">Import</string> <string name="button_apply_config">Import</string>
<!-- hint about new board themes (i.e. dark mode) feature. The
name of the preference controlling the theme is substituted in -->
<string name="not_again_boardThemes_fmt">The board is now being
drawn dark because “Dark theme” is enabled on your device.
\n\nIf you prefer the old “Light” theme, or to choose a theme
independent of Androids “Dark theme” setting, you can change “%1$s”
in App Settings at any time. The “Settings” button below will take
you there now.
</string>
<!-- Button referenced in text above. Should match! -->
<string name="button_settings">Settings…</string>
</resources> </resources>