Principal Software Engineer at Allscipts in Malvern, Pennsylvania, Microsoft Windows Dev MVP, Husband, Dad and Geek.
49002 stories

Introducing Binding Tools for Swift

1 Share

If you follow my blog, you’ve probably noticed two things: it’s been quiet here as of late and I haven’t spoken directly about what I’ve been working on since I joined Xamarin. Let’s change both of those things.

Today a vast majority of the APIs and libraries powering Apple’s ecosystem (iOS,macOS, tvOS, watchOS) come in the form of Objective-C libraries. Xamarin’s binding project support can expose these APIs in C# for use the same as any other managed library. The same infrastructure powers the platform assemblies, like Xamarin.iOS.dll.

A few years ago Apple introduced a new programming language called Swift, which has been under active development with a number of breaking changes over the years due to the evolution of the language. Swift by default has a very different runtime design than other languages. This makes calling Swift code exceptionally difficult from C# in most cases.

Solving this problem required writing a tool significantly more complex than our existing binding infrastructure. One advantage of Swift libraries, however, is that they contain enough information to automatically create a reasonable API mapping to C#. This means we can improve upon the experience of binding Objective-C by skipping the need for a user to define the interface in C# by hand.

After years of development and 1200 unit tests and tests on 3rd party libraries, we’re happy to announce that we’re open sourcing our work:

Current Status

Binding Tools for Swift currently works on most of the common cases for in Swift 5.0 code, but there are limitations that we are actively working on:

  • Project and MSBuild support to make it easier to use
  • Support for Protocols with Associated Types
  • Support for Swift 5.1
  • Support for non-escaping closures
  • Support for closures in bound generic types
  • Improving documentation and samples

There is also work that needs to be done to fully integrate BTfS into Visual Studio for Mac and bring it into a public preview.

Get Involved!

It’s been a lot of work and a lot of typing. I’m very happy with where the code is today and am looking forward to getting my first community pull request. Get involved! I’ve written a lot of documentation on how the tool works and you can read the quickstart guide here.

I’m proud of the work that I’ve done and I’m very happy to bring Swift interoperability into the .NET ecosystem. Come help me out!

Read the whole story
2 hours ago
West Grove, PA
Share this story

Modular Flutter Apps — Design and Considerations

1 Share

An in-depth look into dividing our Flutter apps into different mlodules.

Read the whole story
2 hours ago
West Grove, PA
Share this story

Run Flutter Driver tests on GitHub Actions

1 Share

GitHub Actions is a new feature of Github that enables to create of a custom software development life cycle workflow directly in GitHub repository. You can write individual tasks, called actions, and combine them to create a custom workflow. Workflows are custom automated processes that you can set up in your repository to build, test, package, release, or deploy any code project on GitHub.

Let’s see whether we can run Flutter Driver Tests on GitHub Actions!

Create an app with Integration tests

To play around with GitHub Actions we have a standard Flutter Counter App.

Standard Flutter “Hello World” app

We’ll add Flutter Integration tests to the project. To learn how to write Integration tests, please check out the official documentation.

The first test checks that the counter text equals 0 when we start the app.

test('starts at 0', () async {
expect(await driver.getText(counterTextFinder), "0");

Then we press FAB once and check that the counter text equals 1.

test('increments the counter', () async {
await driver.tap(buttonFinder);
expect(await driver.getText(counterTextFinder), "1");

To see the whole code of the Flutter Integration tests, please have a look here.

Now we are ready to add GitHub Actions workflow to run Flutter Driver tests.

Add GitHub Actions to the project

  1. Add .github/workflows directory in your project
  2. Create a workflow files with .yml or .yaml extension. In my example it is flutter-drive.yml .
  3. Add the following content to your yml file.
# Name of your workflow.
name: flutter drive
# Trigger the workflow on push or pull request.
on: [push, pull_request]
# A workflow run is made up of one or more jobs.
# id of job, a string that is unique to the "jobs" node above.
# Creates a build matrix for your jobs. You can define different
# variations of an environment to run each job in.

# A set of different configurations of the virtual
# environment.

- "iPhone 8 (13.1)"
- "iPhone 11 Pro Max (13.1)"
# When set to true, GitHub cancels all in-progress jobs if any
# matrix job fails.

fail-fast: false
# The type of machine to run the job on.
runs-on: macOS-latest
# Contains a sequence of tasks.
# A name for your step to display on GitHub.
- name: "List all simulators"
run: "xcrun instruments -s"
- name: "Start Simulator"
run: |
xcrun instruments -s |
awk \
-F ' *[][]' \
-v 'device=${{ matrix.device }}' \
'$1 == device { print $2 }'
xcrun simctl boot "${UDID:?No Simulator with this name found}"
# The branch or tag ref that triggered the workflow will be
# checked out.

- uses: actions/checkout@v1
# Sets up a flutter environment.
- uses: subosito/flutter-action@v1
channel: 'stable' # or: 'dev' or 'beta'
- name: "Run Flutter Driver tests"
run: "flutter drive --target=test_driver/app.dart"

I’ve tried to explain every line of the file with comments. If you need more info about syntax for GitHub Actions, please have a look at the doc. I only would like to explain more about the code where we start a Simulator. For most Flutter projects it doesn’t matter whether it’s Android Emulator or iOS Simulator. But Simulator is easier to start and works faster.
To boot a Simulator on Mac from Command Line we can use the following command:

xcrun simctl boot <device>

<device> is a UUID of a simulator. How to get it?

To get a list of created simulators we can run:

xcrun instruments -s

The output looks like this:

The symbols in the square brackets are what we need — UUID. And I’m using awk command to retrieve symbols for a needed device. If I run

echo $(xcrun instruments -s | awk -F ' *[][]' -v 'device=iPhone 8 Plus (13.1)' '$1 == device { print $2 }')

I will get 343A7DF6–23F7–4369–9D9F-1551037CEB97. I’m using ${{ matrix.device }} variable for the device I need to get UUID. After getting the UUID, I boot the device I need.

4. Push your project to GitHub and go to the “Actions” tab. I can see that my actions are running and performed successfully.

5. The last step is to add a Badge in README for the master branch. For my project it is:

[![Build Status](]("flutter+drive"+branch%3Amaster)
GitHub Actions Badge

The full code is here.

Useful links

If you like the article, you can support me 👏 . And follow me on Twitter!

Run Flutter Driver tests on GitHub Actions was originally published in Flutter Community on Medium, where people are continuing the conversation by highlighting and responding to this story.

Read the whole story
3 hours ago
West Grove, PA
Share this story

How To Improve Your Memory

1 Share

Code For Cash

Memory is what makes us into civilized humans. Without the benefit of our own lived experience and the experience of our ancestors, we would still be running around chasing large mammals for dinner. Memory is one of the main things that makes us human, right alongside our ability to speak and to reason in an abstract sense. Further, as people living in an age with a lot of helpful technology, we can often lean heavily on technology to remember things for us.

However, as with any task that can be improved by the use of technology, our reliance on tech to remember things for us comes at a cost. It’s easy to become overly dependent on technology for our memory, which can hinder us a lot if the technology is not available, becomes unreliable, or if we need to recall things quickly without having to look them up.

Having the ability to quickly recall useful information off the top of your head will help your career. Not only can you more quickly make correct decisions, but you can more easily think through difficult problems while in the car, the shower, or other places where a “quick google search” isn’t an option. The nice thing is, good techniques from improving your ability to retain information are widely available, usually free, and widely overlooked by the swarms of sad tech bros out there who lose all productivity when the internet is down.

Improving your memory is extremely helpful for your career. While you can often look things up as you need them, this quickly becomes inefficient. Further, there may be situations where you can’t easily look up information, or where doing so makes you look less competent. Being able to quickly commit new things to memory is critical for modern software development, where things are constantly and rapidly changing. Also, because so many interview questions are based around rote memorization, it helps to have strategies for quickly memorizing new information.

Episode Breakdown

A rough outline of how human memory works

The storage and recall cycle is basically the way we break down the process of remembering. There is a lot going on under the hood, but we’re explaining these here so that when we refer to them later they make sense. To be able to collect a memory, you have to be paying attention and be able to use your senses effectively. Encoding is the process by which your sensory input is transferred to a form that can be stored. This is roughly analogous to serialization. Storage is the process by which the encoded version of your memory is stuffed. Recall is the process by which you retrieve your memories for use. We’re simplifying this a lot, because there is an enough information out there just on this part of the process to make an episode of its own.

The different “levels” of memory. There is a lot more popsci here than either of us would like. The general concepts are correct, but things get complicated really quickly when you get into the low-level neuroscience behind this stuff. Short term memory is the capacity for holding, but not manipulating a small amount of information for a short amount of time, usually just for a few seconds. Working Memory is a cognitive system with a limited capacity for temporarily holding information available for processing. It’s important for reasoning and decision-making behavior. Long term memory is the stage of memory where knowledge is held indefinitely. Muscle Memory is a form of procedural memory that involves consolidating a specific task into memory through repetition. This kind of memory is in play when you are learning things like playing an instrument, learning a foreign language with sounds that your native language lacks or performing in sports.

Your neural architecture (drastically simplified). The neurons in your brain and the connections between them are the storage location for your memories. Nerve cells connect with each other at a point called a synapse, which is where electrochemical pulses leap the gaps between cells. These connections change continuously in response to stimuli. The more a connection is used, the “stronger” and more permanent it becomes.

Lifestyle fixes that you need.

Lack of sleep will destroy your ability to remember things in general. Some research has shown that sleeping shortly after learning new information helps with retention, including over the long term. There are even some people who swear by learning DURING sleep. To test this out, scientists played a sound along with a pleasant smell while people were sleeping. When the subjects awoke, they started sniffing when they heard the sound. While this seems to point to something going on, it probably isn’t enough to validate the “bro-science” stuff about learning while sleeping. But it does mean that something useful is going on and that sleep is necessary for learning.

Exercise has been clinically proven to improve your retention of information. This is even true for older adults, as a 2013 study showed that after a fifteen minute exercise session, participants showed an improvement in memory and cognitive processing. Your diet impacts the rest of your health, so if your diet is bad enough, your health will also be bad enough to make it hard to learn anything. However, there are also some foods that are particularly bad for you. For instance, there is some indication that sugary drinks may contribute to a higher risk of dementia. This is true of refined carbohydrates in general as well. Trans fats, expecially the sort that are industrially produced (hydrogenated vegetable oils) increase the risk of alzheimer’s, damage memory, and contribute to cognitive decline. Overly processed foods in general are also not helpful, as they tend to have a lot of added sugar, transfats, and the like. Aspartame has been shown in a few studies to worsen performance on memory tests, but research is still ongoing there. Alcohol doesn’t help either, but you probably already knew that.

For a high degree of retention, focus on what you are learning, don’t multi-task by watching TV at the same time. While you can learn with background noise and other things going on (people do it all the time), you will make more effecient use of your study time if it’s the only thing you are doing. There are a huge number of studies backing this, and it’s also common sense.

The time of day matters as well. Declarative memory tasks (ability to recall exact details) are better in the morning. Semantic memory tasks (ability to tie what we are learning to what we already know) are better in the afternoon. The science is starting to lean towards the afternoons being better for studying as a result, with mornings being better for researching new information.

Caffeine helps too. A certain amount of caffeine will help you retain information, provided that you don’t overdo it. You also have to be careful of this if you are studying in the afternoon and are sensitive to caffeine, as it helps less than a good night’s sleep. If you screw up your sleep cycle, it won’t help at all.


The simplest way to remember a sequence of simple facts is to break them into groups and then memorize the groupings. This is a good way to overcome the limitations of our short term memory because it reduces the number of “things” that you have to remember. This is why (for those of us old enough to remember…cough) people tended to remember local US phone numbers as three digits and then four digits, instead of as a seven digit string.

When trying to chunk, take the list of items that you need to recall and break them into groups. For instance, with vocabulary words, you might take words that share a context, and group those together. As you get used to chunking things, there is also a higher order improvement in your ability to chunk, increasing the number of things you can collect in a group. You might also do this with chord progressions in music. Instead of remembering individual notes, you remember sets of them. Combined with muscle memory, this tends to be the way a lot of musical types recall things.

Spaced Repetition

When trying to study things for recall, it’s far better to study with some gaps than it is to attempt to cram. Not only will this reduce fatigure, but you also need to regularly refresh information in order to keep it. The more frequently you encounter a piece of information that you have already encoded, the less often you need to refresh it to keep it encoded. As a result, having a regular habit of refreshing information that you are not constantly using, but will need, is a good idea.

The Leitner method for flashcards is a good example of this approach. Have a box full of flashcards, with several compartments, labeled numerically (typically 5). If a flashcard is new, it goes into compartment 1. If you know the material well and the card is in compartment 1, it goes into compartment 2. The process repeats for each additional compartment, for as many compartments as you have. You review the cards in the first compartment daily, the cards in the second comparment every other day, and so on. The idea basically is that as you internalize information, you review it less often. Automated versions of this approach are used in a lot of spaced repitition systems.

Memory Palace Method

Another approach is to tie your memory of things to spatial concepts. It turns out that our long history of being hunter gatherers makes us have very good memory in regards to spatial concepts (because getting lost was fatal for most of our evolutionary history). As a result, if you can tie something you are learning to a spatial concept, you can often remember things better.

Pick a place that you know well, and plan a route through the area. Take the list of things you want to memorize and place them mentally at locations along the route. Try to exaggerate the items and make them interact with the environment in your mind. The idea is to tie these things to your existing memory of that particular location. Don’t be afraid to be weird or humorous. This will enhance your ability to remember the information. Write the stuff down, then walk back through the scene in your mind repeatedly.

Associating Items with things you already know

If you’ve already got related information in long term memory, it’s a lot easier to tie other things to it. One example of this is that everyone can remember the shape of Italy, because it is shaped like a boot. Unless you are in that part of the world, you likely don’t remember the shape of Ecuador (shaped a bit like a dove flying to the right). This is also why we use analogies so much on this show – it’s because it’s a way of implanting information by tying it off to something else you already know.

Basically take a mental image of something you know, and then mix in the thing that you are trying to learn.

Acronyms and other Mnemonics

Similarly, you can remember a sequence of things by remembering acronyms for each of the items in sequence. This is often referred to as a mnemonic. This takes advantage of the way the human mind tends to do better at remembering certain kinds of things, such as musical jingles. Most of us in the United States learned things such as the states in the country, the planets in the solar system, and the way biological categorization works using Mnemonics.

Med school students seem to really leverage this stuff a lot. This tends to be a winning strategy when someone needs to memorize a lot of lists and processes.

Tying things to visual indicators

You might also tie things to something visible. For instance, if you are learning a foreign language, you might stick post-its on everything in the house with the word for that thing in the other language.

The idea here is two-fold. It directly ties memories to physical objects, and it will cause repeated exposure at intervals. This will not work very well for abstract concepts, but it does well for physical ones. It’s essentially a memory palace, except you live there.

Write by hand instead of typing

When collecting new information, retention is improved by writing it out by hand instead of typing. Writing by hand also tends to force you to summarize what you are learning, which is better for recall, since you probably can’t handwrite things as quickly as you can receive the information, which is not true of typing. When typing, it’s easier to transcribe without really listening and processing the information.

These things even hold true for situations where you are studying video courses and able to pause. There was a study a while back where half of the students in a class were told to use computers to take notes, while the other half used handwritten notes. The students had similar levels of recall for the information in the class, but the students who used computers to take notes had much poorer performance on conceptual questions.

Teach other people

To really get a deep understanding of something to the level that it is instinctive, try teaching other people. This podcast is a great example of this principle in action. We both have learned and internalized a lot of things from having to package information up in a form that you can consume. For instance, while we often come up with analogies on the fly during the show, we often remember things we have covered based on the analogies we came up with as we were talking.

Because you must summarize and organize information when communicating with other people, you are forced to work to both organize the information and express it in an appropriate manner. This is one of the hidden benefits of conducting a lunch and learn – you’ll often get a much deeper understanding of the material by teaching than you will by being one of the learners. This approach also neatly and automatically forces you to engage in the activities that help you retain information, as discussed earlier.

Book Club

How to Think Like a Coder (Without Even Trying!)

Jim Christian

The second section of the book looks at problem solving. It starts off talking about the problem solving mentality and how the brain works to solve problems. It then goes into breaking down complex problems. Next the book provides some mental exercises to practice problem solving. It then goes into logic statements and working with constraints. Finally it gets into simplification and the need to keep logic as simple as possible for the computer.

Tricks of the Trade

Be willing to go old school. Things that have worked for thousands of years will still work tomorrow. The app that will do it for you may not.

Editor’s Notes:

The post How To Improve Your Memory appeared first on Complete Developer Podcast.

Download audio:
Read the whole story
3 hours ago
West Grove, PA
Share this story

Entity Framework Core 3 with Julie Lerman

1 Share
What's up with Entity Framework? Carl and Richard talk to Julie Lerman about the latest updates to Entity Framework, both EF 6 and Entity Framework Core 3.0. The discussion dives into this transitory time in the world of .NET, where .NET framework and .NET Core live side-by-side, and looking to a future of a unified .NET 5. Julie talks about the new features in EF Core 3.0 and what's coming shortly in EF Core 3.1. There are more breaking changes than new features, but it should all be worth it, lining up for what comes in the next year. Exciting times!

Download audio:
Read the whole story
3 hours ago
West Grove, PA
Share this story

Motorola RAZR hands-on: Back to the future

1 Share

The flip phone makes a triumphant and expensive return in 2020.

I'd imagine many of the Motorola RAZR previews you're going to read this week will start something like this: "The original Motorola RAZR, which came out more than 15 years ago, was the first cellphone that worked well and looked good. I have a lingering nostalgic love of the form factor, and the audible snap brings me back to a particular time and place."

I have none of that. My first cellphone was a Sanyo something-or-other, and by the time I replaced it, the iconic RAZR V3 was long discontinued. I did briefly own a Motorola KRZR before falling for the sliding seduction of the LG Shine, but my appreciation for the RAZR, unlike many people's, was tangential.

Which is why I'm so surprised that I had so many warm feelings for the new Motorola RAZR, a $1500 Verizon exclusive that, aside from its vertical fold, says little about the future of the smartphone industry.

The return of the flip phone

If you've ever used a flip phone, you know what to expect here. Motorola has reimagined the original RAZR V3, chin and all, for a 2019 — actually, 2020 — audience. It's a lot wider than that phone, though still objectively and sometimes frustratingly narrow compared to "normal" devices on the market. Flipped open, there's a 6.2-inch pOLED display likely dual-sourced by TCL, an up-and-coming manufacturer of foldable OLED panels (but a veteran at the fixed flat versions), and BOE.

The most impressive part about the RAZR is that when flipped open you can't tell that the screen folds

While the 2142x876 panel isn't that sharp, it looks quite good and gets bright enough for most applications. But most impressively, and something I couldn't really believe until I spent a few hours with the phone, is that after hundreds of folds there's no discernible crease in the plastic panel. Contrast this with the Galaxy Fold, where the inner crease is obvious to the point of distraction, that's a laudable achievement. Motorola's also done some interesting things to prevent debris ingress from affecting the long-term performance of the RAZR. The hinge is capped, just like the re-released Galaxy Fold, but there's an extra flexible plastic layer on top of the primary one that's meant to prevent dings, scratches and, ultimately, premature damage.

Also interesting is the bravado with which Motorola is approaching the actual day-to-day usability of its first flexible phone; use it, they say. Don't worry about getting it wet — while there's no IP rating, the RAZR is splash-proof thanks to a nano-coating that all of the company's phones receive. The stainless steel frame is also incredibly hardy and should hold up far better to wear and tear than the Galaxy Fold, low bar as that is. Motorola's also offering free screen replacements for the duration of the one-year warranty, after which it'll be $300.

Motorola RAZR opening and closing

But this is a far more compact object to protect than the Galaxy Fold, and Motorola's trying to achieve something very different: making a regular-sized phone out of something small. Folded, the RAZR measures just 72 x 94 x 14 mm, making it petite enough to fit in all but the most diminutive of pockets. It's a truly impressive demo, especially since opening and closing the phone feels just as satisfying as you'd hope — more so when you figure out how to do it with one hand, just like with the original. One of my favorite moments from the demo was making a call and hanging up by slamming the phone shut with a visceral thud.

When closed, the RAZR has a small 2.7-inch OLED panel for notifications and video calls, which Motorola is calling Quick View. It doesn't do much — unlike the Galaxy Fold's outer display, there's no Android interface you can browse — but it does allow you to read and reply to incoming messages, ask Google Assistant the weather, toggle Wi-Fi and Bluetooth, control music, and make NFC payments.

Lost in time and space

Motorola admits that it's been working on this phone for a long time — with parent company Lenovo, the company began researching applications for flexible displays back in 2015. The components were finalized in early 2018 to make sure that, once put together, the RAZR could withstand everyday wear and tear.

But that protracted development process comes at a cost: the phone's internals are decidedly mid-range, highlighted by a Snapdragon 710 processor that debuted in mid-2018 and lacks the power we've come to expect from devices at this price range. It's still a capable chip for sure, with two high-performance cores based on ARM's Cortex-A75 architecture and six low-power cores based on the Cortex-A55. The problem is that the 710 has been replaced by the Snapdragon 730, which is both more powerful and power-efficient, and that chip too is likely to be superseded by a newer Snapdragon 700-series chip in the coming months.

Motorola RAZR specs: Everything that powers Moto's new foldable

To ensure the phone runs well, there's 6GB of RAM on-board, along with 128GB of non-expandable storage. In fact, you're not going to need any SIM card doohickey for this phone, as it's the first phone released in the U.S. to use an eSIM as its primary way of connecting to the network.

Of course, being a Verizon exclusive, that network will necessarily be Verizon, but Motorola says that once the phone is unlocked it can be easily transferred to another carrier as long as it supports eSIM technology, which means AT&T and T-Mobile in the U.S. and all four major carriers in Canada, along with a bunch of others around the world. As a network nerd, this makes me extremely happy — I've been looking forward to getting rid of physical SIM cards for years now — since, in theory, it means switching carriers is as simple as obtaining a QR code. We'll see, though, how that works in practice.

If you're scrutinizing the rest of the parts that make up the whole, the rest of the spec sheet is a cause for concern. The battery inside the RAZR is small, even for a phone of this size. While Motorola says the 2510mAh cell will last for over a day thanks to the battery-sipping processor and all the software optimizations on board, it's still concerning to see such a small number on the page.

There's also a small fingerprint sensor on the front of the phone, another vestige of a design that appears to have been finalized before the proliferation of the in-display variety (though I'm actually grateful for the reliability of a capacitive sensor in this case).

A single 16MP camera sits on the phone's front, which turns into the phone's rear when the screen is extended. Motorola says that the sensor does everything a phone needs, but there are a few issues with that statement: the sensor itself is relatively old, an IMX519 that showed up in devices like the OnePlus 6 and 6T, along with the Moto G7 Plus earlier this year, and early samples show little promise that it performs better than other much cheaper Motorola devices.

The camera does some interesting things, though, thanks to the interplay with the small front display: it'll show a little animated disembodied cartoon face to remind kids to smile, and it'll also show a preview to the subject after the photo is taken. And because the outer camera is also a selfie shooter when the RAZR is folded, it can be used to frame and take a selfie. Small additions, sure, but Motorola plans to add to the experience over time.

Unfortunately, time isn't on Motorola's side.

The software waiting game

The Motorola RAZR launches in January 2020 with Android 9 Pie. Why launch with a version of Android that was announced in mid-2018 and not the newer, better, faster, more foldable-compatible software that launched this year? Because, as with the hardware, the software has been in development for a very long time.

That means a couple things: it's really stable right now and feels polished, but it also means that users are stuck waiting for the real foldable experience until well after the phone is released. And releasing a phone in early 2020 with Android 9 is borderline insulting.

Motorola says that it's working with Google to expedite the release of Android 10 for shortly after the phone's January debut, but who knows how long it will actually take. Motorola hasn't filled us with confidence with its update cadence on its other phones.

OK, now what?

While it's launching today, the RAZR doesn't actually come out until early January. You won't even be able to pre-order it until December 26, which is baffling. That it's a Verizon exclusive also means the potential audience for this product is limited at best, and while it's no surprise — Motorola has been close with Verizon since the days of the original Droid, and Big Red passed on the Fold's re-release recently — it's still difficult to countenance Motorola's ultimate goal with the RAZR. Who is it for? Who's going to spend $1500, or $63 per month, for a glorified flip phone?

Motorola's spent the last three years building a small phone that flips out to become a bigger one. It's awesome that such a thing is possible, and there's just something truly exhilarating and a bit cheeky about being able to show it off.

Motorola RAZR opening and closing

But I wonder if that's just what it is: a showpiece, a design object, something to show off. As practical as the phone itself is, the circumstances around its price and availability make it the very opposite of practical. Whether that's ultimately to Verizon's and Motorola's benefit remains to be seen, but the RAZR, unlike its 2004 predecessor which sold in the millions, is unlikely to reach the pockets of more than a few thousand people.

The new flip phone

Motorola RAZR (2020)

$1500 at Verizon

Motorola throws it back to 2004

Motorola's first foldable phone is also a flip phone — a device that goes from small to big and back again with the flip of a hinge. It's coming in early 2020 for $1500 as a Verizon exclusive.

Read the whole story
3 hours ago
West Grove, PA
Share this story
Next Page of Stories