trying to fix NoDisplay theme crashes on Marshmallow

This commit is contained in:
Mariotaku Lee 2015-10-06 21:36:51 +08:00
parent 674202dbea
commit 3ef40e2e53
14 changed files with 213 additions and 153 deletions

View File

@ -47,7 +47,7 @@ android {
}
repositories {
maven { url 'http://repo.commonsware.com.s3.amazonaws.com' }
maven { url 'https://repo.commonsware.com.s3.amazonaws.com' }
}
configurations {

View File

@ -32,6 +32,7 @@ public class CreateComposeShortcutActivity extends Activity implements Constants
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setVisible(true);
final Intent intent = new Intent();
final Intent launch_intent = new Intent(INTENT_ACTION_COMPOSE);
final ShortcutIconResource icon = Intent.ShortcutIconResource.fromContext(this, R.mipmap.ic_launcher);

View File

@ -45,6 +45,7 @@ public class MainActivity extends Activity implements Constants {
}
ThemeUtils.overrideActivityOpenAnimation(this);
super.onCreate(savedInstanceState);
setVisible(true);
final Intent intent = new Intent(this, HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);

View File

@ -33,6 +33,7 @@ public class UsageStatisticsActivity extends Activity implements Constants {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setVisible(true);
final Bundle fragmentArgs = new Bundle();
fragmentArgs.putInt(EXTRA_RESID, R.xml.preferences_usage_statistics);
final Intent intent = new Intent(this, SettingsActivity.class);

View File

@ -29,50 +29,56 @@ import org.mariotaku.twidere.util.ThemeUtils;
public class ColorPickerDialogActivity extends BaseSupportDialogActivity implements Callback {
public static final int RESULT_CLEARED = -2;
public static final int RESULT_CLEARED = -2;
@Override
public int getThemeResourceId() {
return ThemeUtils.getNoDisplayThemeResource(this);
}
@Override
public int getThemeResourceId() {
return ThemeUtils.getNoDisplayThemeResource(this);
}
@Override
public void onCancelled() {
finish();
}
@Override
public void onCancelled() {
finish();
}
@Override
public void onColorCleared() {
setResult(RESULT_CLEARED);
finish();
}
@Override
protected void onStart() {
super.onStart();
setVisible(true);
}
@Override
public void onColorSelected(final int color) {
final Intent intent = new Intent();
intent.putExtra(EXTRA_COLOR, color);
setResult(RESULT_OK, intent);
finish();
}
@Override
public void onColorCleared() {
setResult(RESULT_CLEARED);
finish();
}
@Override
public void onDismissed() {
finish();
}
@Override
public void onColorSelected(final int color) {
final Intent intent = new Intent();
intent.putExtra(EXTRA_COLOR, color);
setResult(RESULT_OK, intent);
finish();
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
final Intent intent = getIntent();
final ColorPickerDialogFragment f = new ColorPickerDialogFragment();
final Bundle args = new Bundle();
args.putInt(EXTRA_COLOR, intent.getIntExtra(EXTRA_COLOR, Color.WHITE));
args.putBoolean(EXTRA_CLEAR_BUTTON, intent.getBooleanExtra(EXTRA_CLEAR_BUTTON, false));
args.putBoolean(EXTRA_ALPHA_SLIDER, intent.getBooleanExtra(EXTRA_ALPHA_SLIDER, true));
f.setArguments(args);
f.show(getSupportFragmentManager(), "color_picker_dialog");
}
}
@Override
public void onDismissed() {
finish();
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
final Intent intent = getIntent();
final ColorPickerDialogFragment f = new ColorPickerDialogFragment();
final Bundle args = new Bundle();
args.putInt(EXTRA_COLOR, intent.getIntExtra(EXTRA_COLOR, Color.WHITE));
args.putBoolean(EXTRA_CLEAR_BUTTON, intent.getBooleanExtra(EXTRA_CLEAR_BUTTON, false));
args.putBoolean(EXTRA_ALPHA_SLIDER, intent.getBooleanExtra(EXTRA_ALPHA_SLIDER, true));
f.setArguments(args);
f.show(getSupportFragmentManager(), "color_picker_dialog");
}
}
}

View File

@ -20,9 +20,9 @@ import java.util.Date;
import java.util.Locale;
public class DataExportActivity extends ThemedFragmentActivity implements FileSelectorDialogFragment.Callback,
DataExportImportTypeSelectorDialogFragment.Callback {
DataExportImportTypeSelectorDialogFragment.Callback {
private ExportSettingsTask mTask;
private ExportSettingsTask mTask;
@Override
public int getThemeColor() {
@ -30,113 +30,119 @@ public class DataExportActivity extends ThemedFragmentActivity implements FileSe
}
@Override
public int getThemeResourceId() {
return ThemeUtils.getNoDisplayThemeResource(this);
}
public int getThemeResourceId() {
return ThemeUtils.getNoDisplayThemeResource(this);
}
@Override
public void onCancelled(final DialogFragment df) {
if (!isFinishing()) {
finish();
}
}
@Override
public void onCancelled(final DialogFragment df) {
if (!isFinishing()) {
finish();
}
}
@Override
public void onDismissed(final DialogFragment df) {
if (df instanceof DataExportImportTypeSelectorDialogFragment) {
finish();
}
}
@Override
public void onDismissed(final DialogFragment df) {
if (df instanceof DataExportImportTypeSelectorDialogFragment) {
finish();
}
}
@Override
public void onFilePicked(final File file) {
if (file == null) {
finish();
return;
}
final DialogFragment df = new DataExportImportTypeSelectorDialogFragment();
final Bundle args = new Bundle();
args.putString(EXTRA_PATH, file.getAbsolutePath());
args.putString(EXTRA_TITLE, getString(R.string.export_settings_type_dialog_title));
df.setArguments(args);
df.show(getSupportFragmentManager(), "select_export_type");
}
@Override
public void onFilePicked(final File file) {
if (file == null) {
finish();
return;
}
final DialogFragment df = new DataExportImportTypeSelectorDialogFragment();
final Bundle args = new Bundle();
args.putString(EXTRA_PATH, file.getAbsolutePath());
args.putString(EXTRA_TITLE, getString(R.string.export_settings_type_dialog_title));
df.setArguments(args);
df.show(getSupportFragmentManager(), "select_export_type");
}
@Override
public void onPositiveButtonClicked(final String path, final int flags) {
if (path == null || flags == 0) {
finish();
return;
}
if (mTask == null || mTask.getStatus() != AsyncTask.Status.RUNNING) {
mTask = new ExportSettingsTask(this, path, flags);
mTask.execute();
}
}
@Override
public void onPositiveButtonClicked(final String path, final int flags) {
if (path == null || flags == 0) {
finish();
return;
}
if (mTask == null || mTask.getStatus() != AsyncTask.Status.RUNNING) {
mTask = new ExportSettingsTask(this, path, flags);
mTask.execute();
}
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
final File extStorage = Environment.getExternalStorageDirectory();
final String storagePath = extStorage != null ? extStorage.getAbsolutePath() : "/";
final FileSelectorDialogFragment f = new FileSelectorDialogFragment();
final Bundle args = new Bundle();
args.putString(EXTRA_ACTION, INTENT_ACTION_PICK_DIRECTORY);
args.putString(EXTRA_PATH, storagePath);
f.setArguments(args);
f.show(getSupportFragmentManager(), "select_file");
}
}
@Override
protected void onStart() {
super.onStart();
setVisible(true);
}
static class ExportSettingsTask extends AsyncTask<Object, Object, Boolean> {
private static final String FRAGMENT_TAG = "import_settings_dialog";
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
final File extStorage = Environment.getExternalStorageDirectory();
final String storagePath = extStorage != null ? extStorage.getAbsolutePath() : "/";
final FileSelectorDialogFragment f = new FileSelectorDialogFragment();
final Bundle args = new Bundle();
args.putString(EXTRA_ACTION, INTENT_ACTION_PICK_DIRECTORY);
args.putString(EXTRA_PATH, storagePath);
f.setArguments(args);
f.show(getSupportFragmentManager(), "select_file");
}
}
private final DataExportActivity mActivity;
private final String mPath;
private final int mFlags;
static class ExportSettingsTask extends AsyncTask<Object, Object, Boolean> {
private static final String FRAGMENT_TAG = "import_settings_dialog";
ExportSettingsTask(final DataExportActivity activity, final String path, final int flags) {
mActivity = activity;
mPath = path;
mFlags = flags;
}
private final DataExportActivity mActivity;
private final String mPath;
private final int mFlags;
@Override
protected Boolean doInBackground(final Object... params) {
if (mPath == null) return false;
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.US);
final String fileName = String.format("Twidere_Settings_%s.zip", sdf.format(new Date()));
final File file = new File(mPath, fileName);
file.delete();
try {
DataImportExportUtils.exportData(mActivity, file, mFlags);
return true;
} catch (final IOException e) {
e.printStackTrace();
}
return false;
}
ExportSettingsTask(final DataExportActivity activity, final String path, final int flags) {
mActivity = activity;
mPath = path;
mFlags = flags;
}
@Override
protected void onPostExecute(final Boolean result) {
final FragmentManager fm = mActivity.getSupportFragmentManager();
final DialogFragment f = (DialogFragment) fm.findFragmentByTag(FRAGMENT_TAG);
if (f != null) {
f.dismiss();
}
if (result != null && result) {
mActivity.setResult(RESULT_OK);
} else {
mActivity.setResult(RESULT_CANCELED);
}
mActivity.finish();
}
@Override
protected Boolean doInBackground(final Object... params) {
if (mPath == null) return false;
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.US);
final String fileName = String.format("Twidere_Settings_%s.zip", sdf.format(new Date()));
final File file = new File(mPath, fileName);
file.delete();
try {
DataImportExportUtils.exportData(mActivity, file, mFlags);
return true;
} catch (final IOException e) {
e.printStackTrace();
}
return false;
}
@Override
protected void onPreExecute() {
ProgressDialogFragment.show(mActivity, FRAGMENT_TAG).setCancelable(false);
}
@Override
protected void onPostExecute(final Boolean result) {
final FragmentManager fm = mActivity.getSupportFragmentManager();
final DialogFragment f = (DialogFragment) fm.findFragmentByTag(FRAGMENT_TAG);
if (f != null) {
f.dismiss();
}
if (result != null && result) {
mActivity.setResult(RESULT_OK);
} else {
mActivity.setResult(RESULT_CANCELED);
}
mActivity.finish();
}
}
@Override
protected void onPreExecute() {
ProgressDialogFragment.show(mActivity, FRAGMENT_TAG).setCancelable(false);
}
}
}

View File

@ -72,6 +72,12 @@ public class DataImportActivity extends ThemedFragmentActivity implements FileSe
}
}
@Override
protected void onStart() {
super.onStart();
setVisible(true);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

View File

@ -45,6 +45,12 @@ public class FileSelectorActivity extends BaseSupportDialogActivity implements F
}
}
@Override
protected void onStart() {
super.onStart();
setVisible(true);
}
@Override
public void onDismissed(final DialogFragment df) {
if (!isFinishing()) {

View File

@ -21,6 +21,12 @@ public class ThemedImagePickerActivity extends ImagePickerActivity {
return new ThemedIntentBuilder(context);
}
@Override
protected void onStart() {
super.onStart();
setVisible(true);
}
public static final class ThemedIntentBuilder {
private final Context context;
private final IntentBuilder intentBuilder;

View File

@ -230,8 +230,8 @@ public class TwidereApplication extends MultiDexApplication implements Constants
@Override
public void onLowMemory() {
// final ApplicationModule module = getApplicationModule();
// module.getMediaLoaderWrapper().clearMemoryCache();
final ApplicationModule module = getApplicationModule();
module.onLowMemory();
super.onLowMemory();
}
@ -253,7 +253,7 @@ public class TwidereApplication extends MultiDexApplication implements Constants
}
public void reloadConnectivitySettings() {
ApplicationModule.get(this).getImageDownloader().reloadConnectivitySettings();
getApplicationModule().reloadConnectivitySettings();
}
private DiskCache createDiskCache(final String dirName) {

View File

@ -113,11 +113,17 @@ public class TwitterAPIFactory implements TwidereConstants {
}
public static RestHttpClient createHttpClient(final Context context, final Network network, final SharedPreferences prefs) {
final OkHttpClient client = new OkHttpClient();
updateHttpClientConfiguration(prefs, client);
Internal.instance.setNetwork(client, network);
return new OkHttpRestClient(context, client);
}
public static void updateHttpClientConfiguration(final SharedPreferences prefs, final OkHttpClient client) {
final int connectionTimeout = prefs.getInt(KEY_CONNECTION_TIMEOUT, 10);
final boolean ignoreSslError = prefs.getBoolean(KEY_IGNORE_SSL_ERROR, false);
final boolean enableProxy = prefs.getBoolean(KEY_ENABLE_PROXY, false);
final OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(connectionTimeout, TimeUnit.SECONDS);
final long connectionTimeoutMillis = TimeUnit.MILLISECONDS.convert(connectionTimeout, TimeUnit.SECONDS);
final SSLSocketFactory sslSocketFactory;
@ -131,8 +137,6 @@ public class TwitterAPIFactory implements TwidereConstants {
if (enableProxy) {
client.setProxy(getProxy(prefs));
}
Internal.instance.setNetwork(client, network);
return new OkHttpRestClient(context, client);
}
@ -161,7 +165,7 @@ public class TwitterAPIFactory implements TwidereConstants {
} else {
userAgent = getTwidereUserAgent(context);
}
factory.setClient(getDefaultHttpClient(context));
factory.setClient(ApplicationModule.get(context).getRestHttpClient());
factory.setConverter(new TwitterConverter());
factory.setEndpoint(endpoint);
factory.setAuthorization(auth);

View File

@ -25,19 +25,23 @@ import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.utils.L;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.internal.Network;
import org.mariotaku.restfu.http.RestHttpClient;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.util.ActivityTracker;
import org.mariotaku.twidere.util.AsyncTaskManager;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.ReadStateManager;
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.TwitterAPIFactory;
import org.mariotaku.twidere.util.VideoLoader;
import org.mariotaku.twidere.util.imageloader.TwidereImageDownloader;
import org.mariotaku.twidere.util.net.OkHttpRestClient;
import org.mariotaku.twidere.util.net.TwidereNetwork;
import dagger.Module;
@ -49,6 +53,8 @@ import dagger.Provides;
@Module
public class ApplicationModule {
private final SharedPreferencesWrapper sharedPreferences;
private final ActivityTracker activityTracker;
private final AsyncTwitterWrapper asyncTwitterWrapper;
private final ReadStateManager readStateManager;
@ -61,13 +67,14 @@ public class ApplicationModule {
private final RestHttpClient restHttpClient;
public ApplicationModule(TwidereApplication application) {
sharedPreferences = SharedPreferencesWrapper.getInstance(application, Constants.SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
activityTracker = new ActivityTracker();
asyncTaskManager = AsyncTaskManager.getInstance();
asyncTwitterWrapper = new AsyncTwitterWrapper(application, asyncTaskManager);
readStateManager = new ReadStateManager(application);
network = new TwidereNetwork(application);
restHttpClient = TwitterAPIFactory.getDefaultHttpClient(application, network);
imageDownloader = new TwidereImageDownloader(application, network, true);
imageDownloader = new TwidereImageDownloader(application, restHttpClient, true);
imageLoader = createImageLoader(application, imageDownloader);
videoLoader = new VideoLoader(application, imageDownloader, asyncTaskManager);
mediaLoaderWrapper = new MediaLoaderWrapper(imageLoader, videoLoader);
@ -140,4 +147,17 @@ public class ApplicationModule {
public Network getNetwork() {
return network;
}
public void reloadConnectivitySettings() {
imageDownloader.reloadConnectivitySettings();
if (restHttpClient instanceof OkHttpRestClient) {
final OkHttpClient okHttpClient = ((OkHttpRestClient) restHttpClient).getClient();
TwitterAPIFactory.updateHttpClientConfiguration(sharedPreferences, okHttpClient);
}
}
public void onLowMemory() {
mediaLoaderWrapper.clearMemoryCache();
}
}

View File

@ -29,7 +29,6 @@ import android.webkit.URLUtil;
import com.nostra13.universalimageloader.core.assist.ContentLengthInputStream;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.squareup.okhttp.internal.Network;
import com.squareup.pollexor.Thumbor;
import com.squareup.pollexor.ThumborUrlBuilder;
@ -70,25 +69,24 @@ public class TwidereImageDownloader extends BaseImageDownloader implements Const
private final SharedPreferencesWrapper mPreferences;
private final boolean mUseThumbor;
private final String mUserAgent;
private final Network mNetwork;
private final RestHttpClient mClient;
private Thumbor mThumbor;
private RestHttpClient mClient;
private final String mTwitterProfileImageSize;
public TwidereImageDownloader(final Context context, final Network network, final boolean useThumbor) {
public TwidereImageDownloader(final Context context, final RestHttpClient client, final boolean useThumbor) {
super(context);
mContext = context;
mNetwork = network;
mPreferences = SharedPreferencesWrapper.getInstance(context, SHARED_PREFERENCES_NAME,
Context.MODE_PRIVATE, SharedPreferenceConstants.class);
mTwitterProfileImageSize = context.getString(R.string.profile_image_size);
mUseThumbor = useThumbor;
mUserAgent = UserAgentUtils.getDefaultUserAgentString(context);
mClient = client;
reloadConnectivitySettings();
}
public void reloadConnectivitySettings() {
mClient = TwitterAPIFactory.getDefaultHttpClient(mContext, mNetwork);
if (mUseThumbor && mPreferences.getBoolean(KEY_THUMBOR_ENABLED)) {
final String address = mPreferences.getString(KEY_THUMBOR_ADDRESS, null);
final String securityKey = mPreferences.getString(KEY_THUMBOR_SECURITY_KEY, null);

View File

@ -70,7 +70,12 @@ public class OkHttpRestClient implements RestHttpClient {
DebugModeUtils.initForHttpClient(client);
}
public OkHttpClient getClient() {
return client;
}
@NonNull
@Override
public RestHttpResponse execute(RestHttpRequest restHttpRequest) throws IOException {
final Call call = newCall(restHttpRequest);